【发布时间】:2019-12-23 05:51:42
【问题描述】:
我知道问这个问题很愚蠢,但请稍等一下。
我知道什么?
变量
x的范围基本上是定义x的块。如果x属于 那么自动存储类,只能在声明它的块内使用(正好是x的范围)。变量
x的生命周期基本上是允许x存在于内存中的时间段。如果x是一个自动变量,那么默认情况下,它会在其作用域执行后立即被杀死。
那么,我为什么要问这个问题? 是因为我不小心想到了下面这段代码。
#include<stdio.h>
void scratch(void);
int main(void)
{
for(int i = 0; i < 5; i++)
scratch();
return 0;
}
void scratch(void)
{
static int static_var = 0;
int auto_var1, auto_var2 = 0;
printf("[info] 'static' variable = %d | 'auto' variable 1 = %d | 'auto' variable 2 = %d\n", static_var++, auto_var1++, auto_var2);
}
输出:
[info] 'static' variable = 0 | 'auto' variable 1 = 0 | 'auto' variable 2 = 0
[info] 'static' variable = 1 | 'auto' variable 1 = 1 | 'auto' variable 2 = 0
[info] 'static' variable = 2 | 'auto' variable 1 = 2 | 'auto' variable 2 = 0
[info] 'static' variable = 3 | 'auto' variable 1 = 3 | 'auto' variable 2 = 0
[info] 'static' variable = 4 | 'auto' variable 1 = 4 | 'auto' variable 2 = 0
静态变量static_var 做得很好。但是,请注意两个自动变量的行为:auto_var1 和 auto_var2。根据我对自动变量的理解,auto_var1 和auto_var2 在每次迭代中都应该打印0,因为它们的生命周期应该在scratch() 返回main() 的那一刻结束。但看起来这些家伙的寿命很长。所以我的问题是为什么?这是否意味着自动变量的生命周期也等于同一块中静态变量的生命周期?还是基于编译器的问题?
注意:以上代码是在 Ubuntu 17 上通过gcc version 7.2.0 编译的。另外,请尝试回答此问题的每个人:请坚持C 回答。
【问题讨论】:
-
未定义的行为。
-
如果静态变量在退出函数后被销毁,那么下次调用函数时如何保留其值?
-
@phuclv,对于静态变量,我相信,只要程序存在,它们就会存在。但是,它们只能在其范围内使用。而且因为他们的寿命很长,所以他们能够在他们的范围之外保持他们的价值观。
-
未初始化变量
auto_var1的值是不确定的,使用不确定的值会导致C中的未定义行为。
标签: c