在我看来,块中的auto变量在跳转到外部范围后会被释放。然后我写了一个程序来测试这个,令我惊讶的是,它运行正常。它甚至跑了好几次。
该计划是:
#include <stdio.h>
int main(int argc, char **argv)
{
int *a = 0;
{
int b = 2;
a = &b;
}
printf("%d\n", *a);
return 0;
}
打印结果是2,这是怎么发生的?
答案 0 :(得分:2)
根据ANSI标准,块的自动变量'b'的任何引用都是无效的。它取决于编译器,它们如何在堆栈帧上推送和弹出局部变量。可能你的编译器在从最外面的块退出时弹出所有本地。
即使它不在堆栈上,您也可以读取该地址。如果堆栈进一步增长,则该地址可能会被其他变量修改。在这种情况下,您将无法再次读取相同的数据。
答案 1 :(得分:1)
这完全取决于编译器如何实现它?根据标准,您不能在其延迟区域外使用任何本地数据类型。
答案 2 :(得分:0)
自动变量的范围可分为以下几类:
根据声明的位置,它可以具有不同的“可见性”。
在您的代码中,变量“b”仅在其范围内可见。它可以分配内存,并可以在该范围内使用。在外面时,该内存不再与变量“b”相关联。
然而,这并不意味着它被释放。如果声明另一个变量或块,它可能使用相同的内存位置。
您可以添加少量打印件并检查正在引用的内存。这会让你更好地理解。