嗨,任何人都可以告诉我会改变内存中的残留物还是会立即被销毁。
#include <stdio.h>
int main()
{
{
int a=1;
lab:
printf("Value of a : %d",a);
}
return 0;
}
int a 是否仍会留在内存中?
嗨,任何人都可以告诉我会改变内存中的残留物还是会立即被销毁。
#include <stdio.h>
int main()
{
{
int a=1;
lab:
printf("Value of a : %d",a);
}
return 0;
}
int a 是否仍会留在内存中?
a 被破坏(从堆栈中弹出),当您到达 } 之后的行printf
,所以不,它不会保留在您的注释行的内存中。
不,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
如果在多线程环境中使用变量,则应谨慎使用。
首先:它不是特定于实现的。C 标准明确指出,离开块会破坏具有自动(本地声明)生命周期的对象:
对于这样一个没有可变长度数组类型的对象,它的生命周期从进入与其关联的块开始,直到该块的执行以任何方式结束。 [ISO/IEC9899:TC3, 6.2.4, 5]
当然,这很难测试,因为在这种情况下它也失去了作用域。(相反的方法很容易测试。)但这很重要,因为它有一个正式的原因:如果你有一个指向该对象的指针,它的寿命比对象长,那么程序总是不正确的,行为是未定义的——甚至是实现让对象活着。(未定义的行为包括一切正常。)