2012-04-06 7 views
1

Mögliche Duplizieren:
Can a local variable's memory be accessed outside its scope?Zeiger auf lokale Variable in C++

Ich habe den folgenden Code in C++

int* foo() 
{ 
    int myVar = 4; 
    int* ptr = &myVar; 
    return ptr; 
} 

int main() 
{ 
    printf("val= %d", *foo()); 
    return 0; 
} 

Der Ausgang i erhalten ist:

val = 4 

Also meine Frage ist, da myVar eine lokale Variable ist, sollte es nicht weg sein, nachdem die Funktion zurückgibt? und sollte der Zeiger darauf auch kein Nullzeiger sein?

Antwort

3

Also meine Frage ist, da myVar eine lokale Variable ist, sollte es nach der Rückkehr der Funktion weg sein?

Ja. Es würde auf die Adresse zeigen, auf die Sie es eingestellt haben. Die Region war jedoch lokal für die Funktion. Nehmen Sie an, dass es Ihnen nicht gehört, nachdem das, worauf es hinweist, den Gültigkeitsbereich verlässt.

Es ist so falsch, wie:

uint8_t* p = (uint8_t*)malloc(count); 
free(p); 
p[0] = 1; 

aber weitaus schwieriger einen Fehler für Sie oder Ihre Werkzeuge zu diagnostizieren, weil die Region auf dem Stapel existieren würde (es sei denn, optimiert entfernt).

und sollte der Zeiger darauf kein Nullzeiger sein?

Nein. C und C++ verwalten dies nicht für Sie.

0

Die Adresse von ptr * bleibt reserviert, und wenn Sie die Funktion erneut aufrufen, ändert sich der Zeiger. Zumindest wäre das meine Theorie. C++ überschreibt Ihren Zeiger aus Leistungsgründen nicht.

int foo(int val) { 
    int myVar = val; 
    int* ptr = &myVar; 
    return ptr; 
} 

int main() 
{ 
    int *ptr = foo(4); 
    foo(3); 
    printf("val= %d", *ptr); //will print 3 
    return 0; 
} 
+0

Hah bekommen! Jetzt erwähnen Sie, dass Sie die Funktion erneut aufrufen. Ich habe gerade ein kleines Experiment gemacht und eine weitere Frage tauchte auf!: D Also habe ich gerade meinen Code ein bisschen so geändert 'code int main() { printf (" * bar =% d \ n ", foo()); printf ("* bar2 =% d \ n", foo()); System ("Pause"); Rückgabe 0; } ' bar und bar2 haben den gleichen Wert! : O – 0x56794E

+0

Das stimmt, jeder deklarierten Variablen wird ein konstanter Speicherplatz zugewiesen. Dieser Speicherort ändert sich während der Ausführung des Programms nicht. Aber, wie Benutzer 966379 es erwähnt hat, ist es nicht garantiert, ein eindeutiger Ort für alle Bereiche zu sein. –

0

der Speicher die Adresse enthält, die int myvar zu dieser Funktion gehör und alle anderen lokalen Variablen gehaltenen nicht zugewiesenen ist der Moment, die Funktion zurück, jedoch gibt es keine Bereinigungsprozedur in C, so dass der Wert im Speicher wird für den kleinen moment zwischen dem rücksprung und dem darauffolgenden printf unverändert bleiben.

Speicher in C nicht freigeben (oder freigeben) ist wie Löschen einer Datei in Windows, wo der Dateiinhalt vorerst noch auf dem Laufwerk ist, aber jedes Mal überschrieben wird, wenn dieser Bereich wieder benötigt wird sonst. Sie können den Inhalt zwar lesen, aber Sie sollten nicht dem vertrauen, was Sie lesen.

2

In Ihrem Fall wird printf("val= %d", *foo()) den Wert für den Papierkorb gedruckt. Da es keinen anderen Code gibt, wurden diese Daten nicht geändert.

Sie diesen Code ausführen, werden Sie die Idee

int* foo() 
    { 
     int myVar = 4; 
     int* ptr = &myVar; 
     return ptr; 
    } 

    int* foo1() 
    { 
     int myVar = 5; 
     int* ptr = &myVar; 
     return ptr; 
    } 
    int main() 
    { 
     int* x = foo(); 
     int* x1 = foo1(); 
     printf("val= %d", *x); 
     return 0; 
    }