[英]why pointer change exactly?
任何機構有任何想法,為什么這個代碼打印a
,而不是b
?
我測試的那個值mainArea.root->rightBro
當我改變cout
東西。 但為什么?
#include<iostream>
using namespace std;
struct triangle{
triangle *rightBro;
};
struct area{
triangle *root;
} mainArea;
void initialize(){
triangle root;
mainArea.root = &root;
}
int main()
{
initialize();
mainArea.root->rightBro = NULL ;
if (mainArea.root->rightBro == NULL) cout << "a" << endl;
if (mainArea.root->rightBro == NULL) cout << "b" << endl;
return 0;
}
您正在initialize
內存儲指向局部變量的指針。 函數返回后,內存地址不再有效通過指針訪問 - 當mainArea.root
在main
取消引用mainArea.root
時,程序會調用未定義的行為(UB)。
根據定義,當調用UB時,任何事情都可能發生。 你看到的是什么版本的東西。
出於實際編程目的,請在此處閱讀。 如果你很好奇為什么要具體采取這種行為,這里有一個解釋:
在實踐中發生的事情是mainArea.root
在main
的堆棧幀之后指向堆棧上的“未使用”地址。 當您調用operator<<
將分配一個新的堆棧幀,該堆棧幀與mainArea.root
指向的內存重疊。 operator<<
的(堆棧分配的)局部變量覆蓋了該內存的內容,從main
結果來看,它看到了修改后的值。
這個:
void initialize(){
triangle root;
mainArea.root = &root;
}
導致未定義的行為。
變量triangle root;
只有在執行函數時才會持續。 函數返回后,它不再存在。 因此, mainArea.root
指向可以重復用於任何事物的隨機記憶。
因此,函數退出后對mainArea.root
任何使用都是未定義的行為。 意味着應用程序可以做任何事情
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.