簡體   English   中英

如何解釋這個奇怪的輸出? 關於指針和臨時變量

[英]How to explain this strange output? About pointer and temporary variable

誰知道為什么輸出是這樣的?
雖然使用像這樣的指針是錯誤的,但我仍然想知道為什么它的行為方式如此。

int* foo()
{
    int a=9;
    int *p=&a;
    //definitely not right to return a pointer to an invalid varible
    return p;
}
int main(int argc, char* argv[])
{
    int *p=foo();
    cout<<*p<<endl;//9
    cout<<*p<<endl;//2357228
    *p=2;
    cout<<*p<<endl;//2
    (*p)++;
    cout<<*p<<endl;//2357229
    cout<<*p<<endl;//2357228
    cout<<*p<<endl;//2357228
    (*p)++;
    cout<<*p<<endl;//2357229
    cout<<*p<<endl;//2357228

    return 0;

}

將指針/引用返回到函數的本地變量會導致未定義的行為 保證本地/自動變量是活動的,僅在范圍( {} )中有效,在該范圍內定義它不超出該范圍。

未定義的行為意味着程序可以顯示任何行為,並且允許通過C / C ++標准執行此操作。嘗試在發生未定義行為后查找觀察到的行為的推理是沒有意義的,因為此行為可能/可能不一致或者不能依賴。

從好的方面來說,任何優秀的商業編譯器都會為您提供有關此類代碼的警告。

雖然使用像這樣的指針是錯誤的,但我仍然想知道為什么它的行為方式如此。

因為p指向堆棧內存中的一個位置,不斷被cout的<<方法寫入。 每次使用cout時,p的值都可能會改變。

像這樣的代碼是危險的,因為它可以破壞堆棧並導致程序崩潰。

你需要記住的是a和p都是范圍級變量。 因此,返回僅存在於堆棧中的變量的地址(但未在堆上動態分配)是未定義的行為。 因為一旦離開那個地址空間,我們就不再知道寫到那里的東西了。 因此,返回指向局部變量的指針是未定義的行為。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM