基本的c问题-在c中声明静态变量时会发生什么?

Ani*_*Joe 1 c static static-variables

我正在尝试学习在给定函数中定义静态变量时在c中如何工作。例如,当我编写以下代码时:

#include <stdio.h>
void inc() {
  static int c = 0;
  c++;
  printf("%d\n", c);
}

int main(void) {
  inc();
  inc();
  inc();
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

预期的输出显然是:

1
2
3
Run Code Online (Sandbox Code Playgroud)

在第一次调用该函数时,将定义静态变量c并将其值设为0,这是很合理的。它已递增并打印。但是,在第二次询问inc()为什么要保留整数c而不将其设置为零的情况下,即使代码按字面意思说也是如此static int c = 0;。像第一次调用期间一样,编译器中的哪种机制阻止c将其值设置为零?

Sou*_*osh 7

引用C11,第§6.2.4章,对象的存储时间(重点是我的

声明其标识符时没有存储类说明符 _Thread_local,并且具有外部或内部链接或存储类说明符的对象static,具有静态存储期限它的生命周期是程序的整个执行过程,并且在程序启动之前,它的存储值仅初始化一次。

因此,函数调用内部的初始化不会在对函数的每次调用中进行。在main()开始执行之前,它仅发生一次。该变量在程序执行过程中保留最后存储的值,即,在重复调用函数之间保留该值。