2017-02-13 2 views
0

Ich verstehe nicht, warum der folgende C-Code funktioniert (Drucke '53'). Ich dachte, dass Int ein würde auf den Stapel gelegt und weggewischt werden, sobald foo() beendet. Wenn der Compiler stattdessen int auf dem Heap platziert, gibt es eine Möglichkeit, es nicht zu sagen?Legt der Compiler Speicher auf den Heapspeicher?

#include "stdio.h" 

int * foo() 
{ 
    int a = 53; 

    int * b = &a; 

    return b; 
} 

int main(void) 
{ 
    int * c = foo(); 

    printf("%d\n",*c); 

    return 0; 
} 
+1

Genau das passiert. Dieses Programm hat ein undefiniertes Verhalten. – Jon

+1

Sie sind nur glücklich?!. 'a' aka' b' war auf dem Stapel - jetzt lebst du in der Welt des undefinierten Verhaltens –

+1

Du musst eine andere Funktion aufrufen. Ihr Stapelzeiger hatte keinen Grund, ihn mit etwas anderem zu überschreiben. – jiveturkey

Antwort

1

Die ganze Zahl a ist auf dem Stapel gespeichert. Der Grund dafür ist, dass die Funktion foo die Adresse a zurückgibt und die Funktion main diese Adresse dereferenziert, um sie zu drucken, bevor der Inhalt der Adresse a überschrieben wird. Dieses Programm funktioniert in diesem Fall zufällig. Wenn Sie den Wert a für die Lebensdauer des Programms beibehalten möchten, müssen Sie entweder den static Qualifier auf die a-Deklaration anwenden oder auf dem Heap a zuweisen.

Verwandte Themen