c中变量的记忆和范围

时间:2013-07-11 13:18:46

标签: c variables memory memory-management scope

嗨,任何人都可以告诉我,它会在内存中保留变量或者会立即被销毁。

#include <stdio.h> 

int main()
{
    {
        int a=1;
        lab:
        printf("Value of a : %d",a);  
    }   

    return 0;
}

会不会留在内存中?

3 个答案:

答案 0 :(得分:3)

当你到达printf后面的}时,

a被销毁(从堆栈中弹出),所以不,它不会留在你评论行的内存中。

答案 1 :(得分:3)

不,a具有局部范围(在括号之间声明),所以在结束括号中它将被清理。

如果您希望它保留整个程序,请将其声明为static或将其放在任何大括号之外,最好在使用之前。

这有一个额外的好处,就是让编译器为你初始化它。

您可以尝试以下方法:

#include <stdio.h>
int a;

int main()
{
    static int b;

    int c;

    printf("%d, %d, %d\n", a, b, c); /* a and b should print 0, printing c is undefined behaviour, anything could be there */

    return 0;
}

正如Bathsheba指出的那样,如果在多线程环境中使用,static变量应该明智地使用。

答案 2 :(得分:1)

首先:不是具体实现。 C标准明确指出,留下一个块会破坏一个具有auto(本地声明的)生命周期的对象:

  

对于没有可变长度数组类型的对象,   它的生命周期从进入到它所在的区块延伸   关联,直到该块的执行以任何方式结束。   [ISO/IEC9899:TC3, 6.2.4, 5]

当然,这很难测试,因为在这种情况下它也会失去它的范围。 (另一种方法很容易测试。)但这对于一个正式的原因很重要:如果你有一个指向该对象的指针,该对象的寿命比对象长,那么程序总是不正确并且行为是未定义的 - 甚至是一个实现让对象活着。 (未定义的行为包括一切正常。)