C++ 当堆栈内存中变量的地址分配给数据段或堆内存中的指针时,是否有任何错误?
下面的代码有什么错误吗C++ 当堆栈内存中变量的地址分配给数据段或堆内存中的指针时,是否有任何错误?,c++,memory,C++,Memory,下面的代码有什么错误吗 #include <iostream> using namespace std; int* pointer; void assign() { int a = 2; pointer = &a; } int main() { assign(); cout<<*pointer<<endl; } #包括 使用名称空间std; int*指针; 无效分配(){ INTA=2; 指针=&a; } in
#include <iostream>
using namespace std;
int* pointer;
void assign() {
int a = 2;
pointer = &a;
}
int main() {
assign();
cout<<*pointer<<endl;
}
#包括
使用名称空间std;
int*指针;
无效分配(){
INTA=2;
指针=&a;
}
int main(){
赋值();
cout是的,这是未定义的行为
“正确打印出正确的值”的唯一原因是,在大多数常见的体系结构上,堆栈上先前存在变量的空地址不会被此处执行的main
()中的剩余代码覆盖或涂改
main
()中的代码通常会在为运算符构建堆栈帧之前取消对堆栈上指向地址的引用因为CPU尚未使用变量(a)的位置,所以会得到正确的值。但是,如果在打印指针之前,CPU需要变量(a)的位置,你会得到一个错误的值。你的问题是自相矛盾的。首先,你解释了为什么你不希望正确的操作包含输出2。但是,然后你声称它是。它是哪一个?(提示:第一部分是对的,第二部分是错的。)当时,a
不再存在
在assign
的末尾到达。在那个阶段,指针
会变成一个未初始化的变量。谢谢大家。我知道局部变量不能存在于其范围之外。我的意思是上面的程序仍然可以输出正确的值。我不知道为什么,直到你们告诉我这是一个未定义的行为,指针将变成一个未初始化的变量。非常感谢。你的回答解决了我的问题。谢谢你的回答。:)