0

嗨,任何人都可以告诉我会改变内存中的残留物还是会立即被销毁。

#include <stdio.h> 

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

    return 0;
}

int a 是否仍会留在内存中?

4

3 回答 3

3

a 被破坏(从堆栈中弹出),当您到达 } 之后的行printf,所以不,它不会保留在您的注释行的内存中。

于 2013-07-11T13:20:49.037 回答
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如果在多线程环境中使用变量,则应谨慎使用。

于 2013-07-11T13:21:11.350 回答
1

首先:它不是特定于实现的。C 标准明确指出,离开块会破坏具有自动(本地声明)生命周期的对象:

对于这样一个没有可变长度数组类型的对象,它的生命周期从进入与其关联的块开始,直到该块的执行以任何方式结束。 [ISO/IEC9899:TC3, 6.2.4, 5]

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

于 2013-07-11T13:34:29.923 回答