此问题已在此处有答案:
Can a local variable's memory be accessed outside its scope?(20个回答)
5天前关闭。
我很好奇,为什么当“if”范围结束时,“a”即使在“c”之后仍然具有相同的值。
void foo()
{
int* a = nullptr;
if (true)
{
int b = 1;
a = &b;
}
cout<<a<<endl;
int c = 2;
cout<<a<<" "<<*a<<endl;
}
0x7fff3ad69878
0x7fff3ad69878 1
我以为“B”的堆栈空间被释放了,那么下一个var的init会重用地址0x7fff3ad69878?或者这是不可预测的行为,正确的方法是将int b;
与“a”放在同一个作用域中?
1条答案
按热度按时间toiithl61#
我认为重要的是要注意到,预期的行为在这里是未定义的,并且编译器和优化设置中发生的事情是不能指望的,并且是危险的。你可以合理化你的编译器今天正在做的事情,但是明天当你的编译器打补丁时,当你链接不同的代码时,或者当你的操作系统打补丁时,这可能会改变。(这些事情实际上可能不会影响这个特定的行为,但一般来说,这些事情肯定会影响其他“未定义的行为”。
如果您忽略了
if (true)
可能会或可能不会被优化(并且可能会改变一些事情)的事实,那么b
将超出范围。但是编译器可以用多种方式来处理它。编译器可能会把它放在堆栈上,并把它留在那里,这样就有可能 * 但不能保证 * 在一段时间内“未损坏”地引用它。即使c
被示例化,编译器也可能会在堆栈上分配新空间,也可能不会。在这种情况下,如果打印出b
和c
的地址,甚至可以看出它们是堆栈区域中相邻的内存空间。但最重要的是要记住,你应该假设编译器被允许 * 对b
做任何它想做的事情(包括什么都不做),因为它已经超出了范围。我不明白你的问题“什么是正确的方式”…你到底想问什么?