以下代码有什么问题吗?
#include <iostream>
using namespace std;
int* pointer;
void assign() {
int a = 2;
pointer = &a;
}
int main() {
assign();
cout<<*pointer<<endl;
}
据我所知,执行assign()时堆栈内存中存在'a'。因此,在函数assign()运行后,应释放分配给'a'的内存。但是在assign()中,'a'的地址被分配给存在于数据段中的'pointer'。 “指针”在整个程序中退出。
但是在assign()之后,我们打印出之前释放了相应变量的*指针。有什么不对的事情会发生吗?或者这是一种未定义的行为?
事实上,上述程序可以正确运行以打印出正确的值。
答案 0 :(得分:3)
是的,这是未定义的行为。
您正确打印正确价值的唯一原因&#34;是因为在大多数常见的体系结构中,变量存在的堆栈上以前腾出的地址不会被main
()中的剩余代码覆盖或潦草地写入。
main
()中的代码通常会在为运算符&lt;&lt;()函数调用构造堆栈帧之前取消引用堆栈上的地址。
答案 1 :(得分:0)
您获得了正确的值,因为CPU尚未使用变量(a)的位置。但是如果在打印指针之前CPU需要变量(a)的位置,那么你得到的值就会错误。