为什么指针改变了?

Moh*_*ghi 2 c++ struct pointers

任何机构都知道为什么这个代码打印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;
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*Jon 10

您正在从内部存储指向局部变量的指针initialize.函数返回后,内存地址不再有效通过指针访问 - 您的程序mainArea.root在内部解引用时调用未定义的行为(UB)main.

根据定义,当调用UB时,任何事情都可能发生.你看到的是什么版本的东西.

出于实际编程目的,请在此处阅读.如果你很好奇为什么要具体采取这种行为,这里有一个解释:

在实践中发生的事情mainArea.root就是在堆栈帧之后指向堆栈上的"未使用"地址main.当您调用operator<<新的堆栈帧时,会分配该帧,该帧与指向的内存重叠mainArea.root.operator<<(堆栈分配的)局部变量覆盖该内存的内容,从main结果的角度来看,看到修改后的值.


Mar*_*ork 8

这个:

void initialize(){
    triangle root;
    mainArea.root = &root;
}
Run Code Online (Sandbox Code Playgroud)

导致未定义的行为.

triangle root;只要函数正在执行,变量就会持续.函数返回后,它不再存在.因此mainArea.root,可以重复用于任何事物的随机记忆点.

因此,mainArea.root在函数退出之后的任何使用都是未定义的行为.意味着应用程序可以做任何事情