2012-06-21 10 views
5

Ich verstehe nicht, wie dieses Beispiel möglicherweise funktionieren kann:einen Zeiger zurückkehrend

double * GetSalary() { 
    double salary = 26.48; 
    return &salary; 
} 

main() { 
    cout << *GetSalary(); //prints 26.48 

} 

salary eine lokale Variable ist somit in GetSalary(), nachdem sie von der Funktion zurückkehrte, könnte diese Zelle möglicherweise durch eine andere Funktion überschreibt. Ich sehe nicht, wie die Rückgabe eines Zeigers auf eine lokale Variable (nicht auf dem Heap) nicht möglich ist.

+6

Ja, es könnte möglicherweise überschrieben werden. Oder vielleicht nicht. Deshalb wird dies als ** undefiniertes Verhalten ** und nicht als ** garantierter Absturz ** bezeichnet. –

+0

ist es lustig, dass der obove-Code das erste Ergebnis ist, wenn ich googlen "Zeiger aus einer Funktion zurückgeben" – user695652

+0

Ich bekomme oft die gleiche Sache. Ich habe die Idee, dass Google Ihre Suchblase ändert, wenn Sie mit einem Google-Konto bei SO eingeloggt sind. –

Antwort

16

Es funktioniert nicht. Es ist undefiniertes Verhalten. Es scheint zu funktionieren, denn "korrektes Verhalten" ist eine Teilmenge von "jedem möglichen Verhalten".

8

Sie laufen in undefiniertes Verhalten, was bedeutet alles kann passieren. Darunter erscheinen zu arbeiten.

Außerhalb der Funktion hängt der Rückführungszeiger (d. H. Der Speicher, auf den er zeigt, ist ungültig).

Warum es zu funktionieren scheint, läuft auf die Implementierung hinaus. Wahrscheinlich ist der Speicher nicht gelöscht. Obwohl Sie keinen Zugriff darauf haben, auf was der Rückkehrzeiger verweist, ist in diesem Speicher die 26.48 noch vorhanden. Aber es ist nur zufällig.

1

Es funktioniert nicht, es dereferenziert einen Zeiger, der nicht mehr gültig ist. Dass der Speicher, auf den gezeigt wird, zufällig den erwarteten Wert hält, ist kein Zeichen dafür, dass das Programm insgesamt "funktioniert" oder korrekt ist.

Um zu verstehen, warum es funktioniert, müssen Sie das genaue Muster der Stack-Frame-Verschiebungen analysieren, die stattfinden, das ist irgendwie ärgerlich und sehr Compiler-abhängig.

2
double * GetSalary() 
{ 
    double salary = 26.48;  
    return &salary; 
} 
double dummy_function() 
{ 
    double a = 1.1; 
    double b = 2.2; 
    double c = 0 , d = 0; 

    c = a + b - d; 
    return c; 
} 

main() 
{  
    double *a; 
    a = GetSalary(); 
    cout << dummy_function(); 
    cout << *a; //this time it wont print 26.48 
} 

Da Funktion Stapel durch den zweiten Funktionsaufruf dummy_function

0

Dies funktioniert auch überschrieben wurde, ist aber viel sicherer. Es wird nicht richtig in einem Multithread-Programm funktionieren.

double * GetSalary() { 
    static double salary = 26.48; 
    return &salary; 
} 
Verwandte Themen