不同块作用域中的 C++ 变量具有相同的地址

c++ variables in different block scopes has same addresses

本文关键字:地址 变量 C++ 作用域      更新时间:2023-10-16

在下面的代码 #3 和 #4 打印相同的地址 'int i'
谁能描述一下它是如何工作的?
它发生在一些 g++ 中,而不是在 vc++ 中,clang

#include <iostream>
int i = 0;
int main()
{
std::cout << "#1: " << &i << std::endl;
{
int i;
std::cout << "#2: " << &i << std::endl;
{
int i;
std::cout << "#3: " << &i << std::endl;
}
{
int i;
std::cout << "#4: " << &i << std::endl;
{
int i;
std::cout << "#5: " << &i << std::endl;
}
}
}
}

如果我运行上面的代码,结果如下所示

#1: 0x601194
#2: 0x7ffc027b5154
#3: 0x7ffc027b515c
#4: 0x7ffc027b5158
#5: 0x7ffc027b515c

谁能描述一下这是如何工作的?

变量被销毁后(对于自动存储变量,当它们的块结束时发生(,它的内存可以再次重用。因此,您在那里看到的内容 - 案例 #3 上的i被销毁,因为它的块终止并且稍后再次重用内存(在这种情况下,碰巧 #5 中的i重复使用相同的内存(。