我正在尝试学习在给定函数中定义静态变量时c中的静态变量如何工作。例如,当我编写以下代码时:
#include <stdio.h>
void inc() {
static int c = 0;
c++;
printf("%d\n", c);
}
int main(void) {
inc();
inc();
inc();
return 0;
}
预期输出显然是:
1
2
3
在函数的第一次调用中,定义了静态变量c并将其值设置为0,这很合理。它已递增并打印。但是,在第二次调用inc()
时,为什么即使代码字面意思是static int c = 0;
,整数c仍被保留而不设置为零。像第一次调用时一样,编译器中的哪种机制阻止c将其值设置为零?
答案 0 :(得分:7)
引用C11
,第6.2.4章,对象的存储时间(强调我的)
一个其标识符声明为没有存储类说明符的对象
_Thread_local
,并且具有外部或内部链接或与存储类 说明符static
具有静态存储期限。 其生命周期是整个执行过程 程序及其存储值只能在程序启动之前初始化一次。
因此,函数调用内部的初始化不会在每次调用函数时进行。在main()
开始执行之前,它仅发生一次。该变量会在程序执行过程中保留最后存储的值,即在重复调用函数之间保留该值。
答案 1 :(得分:-1)
它的生命周期是程序的整个执行过程,并且其值在程序启动之前被初始化并且只有一次。