2016-12-30 4 views
0

Ich habe Probleme beim Begreifen, warum dies funktioniert:C Zeiger seltsames Verhalten

int main() { 
    int test = 4; 
    int *bar = &test; 
    int **out = &bar; 
    printf("%d\n", **out); 
    return 0; 
} 

aber nicht:

void foo(int *src, int **out) { 
    out = &src; 
} 

int main() { 
    int test = 4; 
    int *bar = &test; 
    int **out; 
    foo(bar, out); 
    printf("%d\n", **out); 
    return 0; 
} 

Der zweite Schnipsel wirft "Segmentation fault". Mir scheint es, sie machen das Gleiche. Kann mir bitte jemand erklären?

Edit: (aktualisierte Code basiert auf Antworten):

void foo(int *src, int **out) { 
    out = &src; 
} 

int main() { 
    int test = 4; 
    int *bar = &test; 
    int *out; 
    foo(bar, &out); 
    printf("%d\n", *out); 
    return 0; 
} 

Warum funktioniert das nicht?

Gelöst: (ich hatte zu durchdenken, was ich wirklich tun wollte), das ist das Ergebnis:

void foo(int *src, int **out) { 
    *out = src; 
} 

int main() { 
    int test = 4; 
    int *bar = &test; 
    int *out; 
    foo(bar, &out); 
    printf("%d\n", *out); 
    return 0; 
} 
+0

Sie beeinflussen die lokale 'int ** out' in Funktion nicht die von Main übergeben, das ist die chronische Frage der Weitergabe von Wert – Raindrop7

Antwort

4

Im zweiten wird die Variable out in main nicht durch die Zuordnung betroffen gemacht innerhalb von foo.

In Ihrem bearbeiten, müssen Sie foo assign in welchem ​​out darin Punkte haben:

*out = src; 
+0

Ich verstehe. Kannst du bitte meine Bearbeitung, wenn ich mich nicht irre, sollte es jetzt funktionieren. – Mykybo

+2

Ja, du hast Recht, ich musste mich hinsetzen und klar darüber nachdenken, was ich tun wollte. Im endgültigen Code bearbeitet. – Mykybo

+1

Klar zu denken ist immer eine gute Idee. –

0

Dinge in Funktionen von Wert übergeben werden. Ändern des Werts in der Funktion ändert nichts in der Außenwelt.

+0

Kannst du bitte meinen Schnitt (in der Frage) anschauen? – Mykybo