从块外部访问块内的自动变量的内存?

时间:2014-01-09 04:21:24

标签: c variables memory-management scope

在我看来,块中的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,这是怎么发生的?

3 个答案:

答案 0 :(得分:2)

根据ANSI标准,块的自动变量'b'的任何引用都是无效的。它取决于编译器,它们如何在堆栈帧上推送和弹出局部变量。可能你的编译器在从最外面的块退出时弹出所有本地。

即使它不在堆栈上,您也可以读取该地址。如果堆栈进一步增长,则该地址可能会被其他变量修改。在这种情况下,您将无法再次读取相同的数据。

答案 1 :(得分:1)

这完全取决于编译器如何实现它?根据标准,您不能在其延迟区域外使用任何本地数据类型。

答案 2 :(得分:0)

自动变量的范围可分为以下几类:

  1. 全球范围
  2. 功能范围
  3. 阻止范围
  4. 根据声明的位置,它可以具有不同的“可见性”。

    在您的代码中,变量“b”仅在其范围内可见。它可以分配内存,并可以在该范围内使用。在外面时,该内存不再与变量“b”相关联。

    然而,这并不意味着它被释放。如果声明另一个变量或块,它可能使用相同的内存位置。

    您可以添加少量打印件并检查正在引用的内存。这会让你更好地理解。