当堆栈内存中的变量的地址被分配给数据段或堆内存中的指针时,有什么问题吗?

时间:2015-07-30 01:26:32

标签: c++ memory

以下代码有什么问题吗?

#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()之后,我们打印出之前释放了相应变量的*指针。有什么不对的事情会发生吗?或者这是一种未定义的行为?

事实上,上述程序可以正确运行以打印出正确的值。

2 个答案:

答案 0 :(得分:3)

是的,这是未定义的行为。

您正确打印正确价值的唯一原因&#34;是因为在大多数常见的体系结构中,变量存在的堆栈上以前腾出的地址不会被main()中的剩余代码覆盖或潦草地写入。

main()中的代码通常会在为运算符&lt;&lt;()函数调用构造堆栈帧之前取消引用堆栈上的地址。

答案 1 :(得分:0)

您获得了正确的值,因为CPU尚未使用变量(a)的位置。但是如果在打印指针之前CPU需要变量(a)的位置,那么你得到的值就会错误。