【问题标题】:C static variables initializationC 静态变量初始化
【发布时间】:2021-12-24 18:42:05
【问题描述】:

我学了一些 C 语言并偶然发现了静态变量的解释。 他们展示了这段代码:

#include<stdio.h>
int fun()
{
  static int count = 0;
  count++;
  return count;
}
  
int main()
{
  printf("%d ", fun());
  printf("%d ", fun());
  return 0;
}

我不明白为什么调用该函数两次就可以了,因为行

static int count = 0;

实际上运行了两次... 我无法理解这怎么可能... 你真的可以声明它两次还是编译器第二次忽略它?

【问题讨论】:

  • 静态变量初始化只在函数第一次被调用时发生。

标签: c static


【解决方案1】:

这(静态/全局)是初始化定义真正不同于未初始化定义后跟赋值的地方。 从历史上看,前者甚至曾经有不同的语法(int count /*no '=' here*/ 0;)。

当你这样做时:

int fun() {
  static int count = 0;
  //...
}

那么除了count的不同作用域(但不是生命周期)之外,它相当于:

static int count = 0; //wider scope, same lifetime
int fun() {
  
  //...
}

在这两种情况下,静态变量都会在加载时初始化,通常与可执行文件中的其他静态变量和全局变量一起初始化。

【讨论】:

    【解决方案2】:

    static 变量在程序启动时初始化,而不是每次调用函数时。

    【讨论】:

    • C 2018 5.1.2 1 表示“所有具有静态存储持续时间的对象应初始化(设置为其初始值)之前 程序启动”,重点补充。
    • 这个答案只对了一半。请更新或删除。
    【解决方案3】:

    ...因为static int count = 0; 行实际上运行了两次。

    没有。只有一次,就在main() 被调用之前。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-26
      • 2015-06-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-22
      • 2010-12-22
      • 2012-08-18
      相关资源
      最近更新 更多