[英]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.