【发布时间】:2016-07-20 00:12:41
【问题描述】:
Here和Here我发现块中的变量是在执行到那个块时创建的,
为了证明我试过这个:
int main()
{
{
char a;
printf("Address of a %d \n",&a);
}
char b;
printf("Address of b %d \n",&b);
}
正如预期的那样,首先创建了b(因为外部块比内部块执行得更快),当执行到达内部块时,a被创建。上述代码的输出:
Address of a 2686766
Address of b 2686767
(在 x86 上测试(堆栈向下增长,因此首先创建具有更大地址的变量)。
但是这个呢?:
int main()
{
{
char a;
printf("Address of a %d \n",&a);
} // I expected that variable a should be destroyed here
{
char b;
printf("Address of b %d \n",&b);
}
}
输出:
Address of a 2686767
Address of b 2686766
我预计 a 在第一个块语句的右大括号处被销毁,因此 a 所在的地址现在位于堆栈顶部,并且 b 应该在这里创建,因此在上面的输出中,两个地址应该相等,但不是吗?变量是否在块结束时被销毁?如果不是,为什么?
【问题讨论】:
-
将
char *传递给printf("%d")的未定义行为。此外,具有自动存储持续时间的单独对象的相对地址未指定。这可能还取决于编译器优化设置。 -
使用
%p打印printf中的指针。 -
你是如何编译你的代码的?你启用优化了吗?
-
@BasileStarynkevitch 不,我没有
-
请记住,仅仅因为您获取变量的地址,您就将它们强制到堆栈中,否则编译器可能会将它们分配到 CPU 寄存器中。