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

时间:2019-06-21 06:02:36

标签: 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;
}

预期输出显然是:

1
2
3

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

2 个答案:

答案 0 :(得分:7)

引用C11,第6.2.4章,对象的存储时间(强调我的

  

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

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

答案 1 :(得分:-1)

它的生命周期是程序的整个执行过程,并且其值在程序启动之前被初始化并且只有一次。