嗨,任何人都可以告诉我,它会在内存中保留变量或者会立即被销毁。
#include <stdio.h>
int main()
{
{
int a=1;
lab:
printf("Value of a : %d",a);
}
return 0;
}
会不会留在内存中?
答案 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]
当然,这很难测试,因为在这种情况下它也会失去它的范围。 (另一种方法很容易测试。)但这对于一个正式的原因很重要:如果你有一个指向该对象的指针,该对象的寿命比对象长,那么程序总是不正确并且行为是未定义的 - 甚至是一个实现让对象活着。 (未定义的行为包括一切正常。)