簡體   English   中英

為什么指針改變了?

[英]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.rootmain取消引用mainArea.root時,程序會調用未定義的行為(UB)。

根據定義,當調用UB時,任何事情都可能發生。 你看到的是什么版本的東西。

出於實際編程目的,請在此處閱讀。 如果你很好奇為什么要具體采取這種行為,這里有一個解釋:

在實踐中發生的事情是mainArea.rootmain的堆棧幀之后指向堆棧上的“未使用”地址。 當您調用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.

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