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结果的角度来看,看到修改后的值.
这个:
void initialize(){
triangle root;
mainArea.root = &root;
}
Run Code Online (Sandbox Code Playgroud)
导致未定义的行为.
triangle root;只要函数正在执行,变量就会持续.函数返回后,它不再存在.因此mainArea.root,可以重复用于任何事物的随机记忆点.
因此,mainArea.root在函数退出之后的任何使用都是未定义的行为.意味着应用程序可以做任何事情