gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:36:23 28 4
gpt4 key购买 nike

这段代码:

#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;
}

打印以下内容:

0x[some address]
0

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

repro case

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

很抱歉没有提及我的 IDE。

最佳答案

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

basic.std/4 :

When the end of the duration of a region of storage is reached, the values of all pointers representing the address of any part of that region of storage become invalid pointer values. Indirection through an invalid pointer value and passing an invalid pointer value to a deallocation function have undefined behavior. Any other use of an invalid pointer value has implementation-defined behavior.

关于c++ - 指向释放变量的指针更改地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57286818/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com