Archiv verlassen und diese Seite im Standarddesign anzeigen : Pointer Frage
07.07.2007
2008-08-16, 18:06:55
Hallo,
folgendes Problem.
void test(int* a, int& b) {
int x = 5;
a = &x;
b = 10;
}
int _tmain(int argc, _TCHAR* argv[])
{
int* a = 0;
int b = 0;
test(a, b);
return 0;
}
Meiner Meinung nach muessten doch a = 5 und b = 10 sein nach dem Aufruf von test().
b ist auch 10
aber warum bleibt a = 0?
Meiner Meinung muesste das klappen. Kann mir jemand bitte erklaeren warum dies so ist?
Danke :)
Die Variable x wird ja auf dem Stack alloziiert und ist daher nach dem Verlassen der Funktion test nicht mehr vorhanden.
Daher zeigt a irgendwo auf den Stack, das Verhalten ist also vermutlich undefiniert.
07.07.2007
2008-08-16, 18:20:38
Ok aber ich verstehe es dann doch nciht ganz. Wie soll ich es sonst machen?
Sorry bin Anfaenger.
Superguppy
2008-08-16, 18:21:34
Korrekt wäre diese Konstruktion:
void test(int* a, int& b) {
int *x;
x = (int*)malloc(sizeof(int));
a = x;
b = 10;
}
Mit malloc() wird der Speicher auf dem Heap adressiert, der auch nach dem Funktionsaufruf noch da ist. Wenn du es ganz sauber machen willst, gehört vor dem return() in der main-Funktion noch ein free(a), um den Speicher wieder freizugeben.
07.07.2007
2008-08-16, 18:24:20
Korrekt wäre diese Konstruktion:
void test(int* a, int& b) {
int *x;
x = (int*)malloc(sizeof(int));
a = x;
b = 10;
}
Mit malloc() wird der Speicher auf dem Heap adressiert, der auch nach dem Funktionsaufruf noch da ist. Wenn du es ganz sauber machen willst, gehört vor dem return() in der main-Funktion noch ein free(a), um den Speicher wieder freizugeben.
Ja aber a ist trotzdem 0
void test(int* a, int& b) {
int *x;
x = (int*)malloc(sizeof(int));
*x = 5;
a = x;
b = 10;
}
int _tmain(int argc, _TCHAR* argv[])
{
int* a = 0;
int b = 0;
test(a, b);
return 0;
}
Glaub in Zeile 6 muss das heissen: *a = x;
also den Sternchen vor a
del_4901
2008-08-16, 18:52:14
Ja aber a ist trotzdem 0
void test(int** a, int& b) {
int *x;
x = (int*)malloc(sizeof(int));
*x = 5;
(*a) = x;
b = 10;
}
int _tmain(int argc, _TCHAR* argv[])
{
int* a = 0;
int b = 0;
test(&a, b);
return 0;
}so, schoener ist natuerl.:
void test(int* &a, int& b) {
int *x;
x = (int*)malloc(sizeof(int));
*x = 5;
a = x;
b = 10;
}
int _tmain(int argc, _TCHAR* argv[])
{
int* a = 0;
int b = 0;
test(a, b);
return 0;
}
is aber beides Dasselbe.
Hoechstwarscheinl. wolltest du aber sowas ueben:
void test(int* a, int& b)
{
(*a) = 5;
b = 10;
}
int _tmain(int argc, _TCHAR* argv[])
{
int a = 0;
int b = 0;
test(&a, b);
return 0;
}
Oh sorry, geht doch nicht.
Wenn überhaupt, müsstest du etwas nehmen wie: *a=5;
gcc frisst das so und so nicht :) (ich sprech jetzt für c, für c++ hab ich keine ahnung)
c erlaubt keine definition der parameter mittels des adressoperators (&)
#include <stdio.h>
void test(int* a, int* b) {
int x = 5;
*a = x;
*b = 10;
}
int main(int argc, char* argv[]) {
int b = 0;
int c = 0;
int* a = &c;
printf("Vor Zuweisung: \n");
printf(" %d %d %d \n", *a,b,c);
test(a, &b);
printf(" %d %d %d \n", *a,b,c);
return 0;
}
an.zgep
2008-08-17, 12:20:38
void test(int* a, int& b) {
int x = 5;
a = &x;
b = 10;
}
int _tmain(int argc, _TCHAR* argv[])
{
int* a = 0;
int b = 0;
test(a, b);
return 0;
}
nachdem du einen "pointer auf int" erzeugst und test() genau diesen typ erwartet ist dein a in test() != a in main(). das a in test() wird genau wie x auf dem stack erzeugt und mit dem wert des main()-as initialisiert, ist also eine kopie des main()-as. wenn du das test()-a veränderst bleibt das main()-a natürlich unverändert. -> call by value
bei b verhält sich das ganze etwas anders: b in main() ist vom typ int. test() erwartet einen typ "referenz auf int". deshalb ist das test()-b eine referenz auf das main()-b, dh das test()-b ist lediglich ein anderer name für das main()-b. jede veränderung des test()-bs verändert in wahrheit das main()-b. -> call by reference
damit das ganze ev. etwas klarer wird hier ein bisschen code der genau das selbe macht wie deiner:
void test(int* value, int& reference) {
int* copy;
copy = value; // copy zeigt auf die gleiche adresse wie value
int x = 5;
copy = &x; // copy zeigt auf die adresse von x
reference = 10;
// copy und x werden hier vernichtet
}
int _tmain(int argc, _TCHAR* argv[])
{
int* a = 0; // zeigt auf eine int an der speicheradresse 0
int b = 0;
test(a, b);
return 0;
}
gcc frisst das so und so nicht :) (ich sprech jetzt für c, für c++ hab ich keine ahnung)
c erlaubt keine definition der parameter mittels des adressoperators (&)
Es handelt sich dabei um Referenzen, welche Bestandteil von C++ sind.
vBulletin®, Copyright ©2000-2025, Jelsoft Enterprises Ltd.