2017-02-27 5 views
0
#include <iostream> 

int Value() 
{ 
    int x = 90;//creates a variable x 
    return x;//returns the value x, into the caller 
    //x is destroyed because it is out of scope 
} 

int * ptr() 
{ 
    int x = 7;//creates variable x 
    return &x;//returns a pointer to x 
    //x gets destroyed because it is out of scope 
} 

Innen HauptfunktionReturn von Wert und von Adresse

 int y = Value();// y = 7 

     int *py = ptr(); 
     /* *py = 7, not Undefined Behaviour?? */ 

ich diesen Code zu erstellen, und das Programm im Debugging, I * py = 7 in meine Uhr Fenster. Sollte ich nicht ein Undefined Verhalten, und das Programm abstürzen, da py zeigt auf eine Adresse, die jetzt Müll haben (x in ptr() ist außerhalb des Geltungsbereichs)

+2

Das Problem mit UB ist, dass eine der Möglichkeiten ist, dass es * scheint * zu funktionieren. Versuchen Sie, die Reihenfolge der Aufrufe zu ändern, und nach dem Aufruf von "Value" wird höchstwahrscheinlich der Änderungswert "* py" angezeigt. –

+0

Ich tat es jetzt gibt mir 0. Dank – Forat

+0

Dies ist auch sehr Compiler und OS abhängig. Dies ist es, was mit undefiniertem Verhalten gemeint ist, weil es Implementierung definiert ist und nicht garantiert wird, dass sie unter allen Umständen gleich funktioniert. – ugar

Antwort

1

Die Funktion ptr gibt einen Wert, die Adresse von die lokale Variable x. Während Sie Ihre Funktion beenden, markiert das Speichermodell nur diese Adresse (& x) als schreibbar, aber der tatsächliche Wert im Speicher wird nicht gelöscht. Wenn Sie also die tatsächlichen Werte der Speicheradresse py betrachten, sehen Sie den Wert 7, aber es könnte geändert werden, wenn eine andere Funktion nach etwas Speicher fragt.

0

Es ist ein dangling pointer geworden. was zu Problemen führen wird, wenn es benutzt wird.

1

Sollte ich nicht bekommen ein nicht definiertes Verhalten

Ja. Das hast du bekommen.

Sollte nicht ... das Programmabsturz

Nr Der Standard definiert nicht, dass das Programm zum Absturz bringen muss. Stattdessen ist das Verhalten n undefiniert.