指向释放的变量更改地址的指针

use*_*875 6 c++ pointers object-lifetime undefined-behavior language-lawyer

这段代码:

#include <iostream>

using namespace std;

int* fun()
{
    int a = 5;
    int* pointerA = &a;

    cout << pointerA << endl;

    return pointerA;
}

int main()
{

    int* p = fun();

    cout << p << endl;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

打印以下内容:

0x[some address]
0
Run Code Online (Sandbox Code Playgroud)

我知道a函数fun()返回时会释放该变量,但是为什么cout << p << endl;返回0?即使变量在技术上不再存在,它也不应该指向内存中的相同地址吗?这是编译器功能还是未定义的行为?

复制案例

编辑:我找到了罪魁祸首。我正在使用CodeBlocks,并且在该项目的构建选项中,有一个标志“优化更多(以提高速度)[-O2]”。如果选中,则得到0,如果不选中该标志,则得到相同的address 0x[some address],这是预期的行为。

对于没有提及我的IDE,我深表歉意。

gez*_*eza 3

访问 的返回值fun具有实现定义的行为,因为它返回无效的指针值(请参阅下面的引用,了解原因)。在特定平台上,它甚至可能产生运行时错误。因此,p的值也是由实现定义的。最有可能的是,它会变成无效的指针值,因此访问它是实现定义的。

基本.std/4

当到达存储区域的持续时间结束时,表示该存储区域的任何部分的地址的所有指针的值变成无效指针值。通过无效指针值进行间接寻址以及将无效指针值传递给释放函数具有未定义的行为。对无效指针值的任何其他使用都具有实现定义的行为