2017-09-12 2 views
1

Dies ist, was ich habe:Verweis auf Zeigerproblem?

void g(int *&x) { 
    int a = 3; 
    x = &a; 
} 
void h(const int *&x) { 
    int b = 2; 
    x = &b; 
} 
int main() { 
    int *p = new int; 
    *p = 5; 
    g(p); 
    cout << p << " " << *p << endl; // Print #2 
    cout << p << " " << *p << endl; // Print #3 
    const int*p1 = p; 
    h(p1); 
    cout << p << " " << *p << endl; // Print #4 
    cout << p << " " << *p << endl; // Print #5 
} 

Von dem, was ich verstehe, Print#2 und Print#3 das gleiche Ergebnis haben sollen, ist es aber nicht, wenn ich es kompilieren. Es geht um Print#4 und Print#5 auch. Kann mir jemand helfen?
Aktualisiert: Dies ist die Ausgabe wie folgt aussieht, wenn ich es auf meinem Computer zusammengestellt:

00EFF9D4 3 //1 
00EFF9D4 1552276352 //2 
00EFF9D4 2 //3 
00EFF9D4 1552276352 //4 

nicht (1) und (2) die gleiche sein? (3) und (4) entweder.

+2

In der Funktion 'g', was ist' a'? Bitte erstellen Sie ein [minimales, vollständiges und überprüfbares Beispiel] (http://stackoverflow.com/help/mcve), um uns zu zeigen. Zeigen Sie uns auch die erwartete und tatsächliche Leistung. –

+5

Wie für die Funktion "h", machen Sie den Zeiger auf eine lokale Variable, die den Gültigkeitsbereich verlässt und nicht mehr existiert, sobald die Funktion zurückkehrt. Die Dereferenzierung dieses Zeigers führt zu [* undefiniertem Verhalten *] (http://en.cppreference.com/w/cpp/language/ub), was das gesamte Programm * schlecht formatiert * und ungültig macht. –

+0

Wahrscheinlich ein Tippfehler, der gemeint ist "int a". – Ron

Antwort

3

Ich nehme an, Sie meinen int a in g().

Ihre Funktion den Zeiger Punkt eine lokale Variable, die nach der Beendigung der Funktion machen,den Gültigkeitsbereich verlassen wird.

Dann dereferenzieren Sie den Zeiger, der Undefined Behavior aufruft.

+0

Der Grund warum das _Undefined Behavior_ in der zweiten _cout_ aufgerufen wurde, während es in der ersten nicht war. –

+0

@DangNguyen ... Undefiniertes Verhalten ... Sie wissen nie, was genau passiert! ;) – gsamaras