【问题标题】:Difference between static global variable and non-static global variable in C [duplicate]C中静态全局变量和非静态全局变量之间的区别[重复]
【发布时间】:2018-12-22 02:28:50
【问题描述】:

“静态全局变量”和“静态全局变量”有什么区别? C语言中的“非静态全局变量”?

请举例说明它们有何不同。

(因为,全局静态变量和简单全局变量在整个程序中都保持活动状态,并且可以在任何块中使用。我很困惑如何区分它们。) 有人可以用代码解释一下吗?

【问题讨论】:

  • 在您最喜欢的 C 资源上简单阅读一下关键字 static 就会发现答案。
  • 基本上,一个static全局变量不能被它定义的文件之外的名字引用;非static 全局变量可以在其他源文件中按名称引用,而不是在它定义的源文件中。How can I use extern to share variables between source files? 相当彻底地涵盖了非静态情况(甚至是冗长的)。 static 的情况很简单——变量可以在定义它的源文件中按名称访问,而不是在任何其他源文件中。
  • 如果你的困惑是英语:“global”和“[non-]static”这两个词可以按任何顺序排列,那么句子的意思是一样的。
  • @Jonathan-Leffler,英语可能是他的困惑。如果您进行了编辑,您能否恢复该部分?
  • 您可以撤消它。我不认为这是一个问题,但如果你认为是,你可以解决它。

标签: c variables scope


【解决方案1】:

基本上有四种情况:

  • 在函数之外声明,没有static
  • 在函数之外声明,带有static
  • 在函数内部声明,没有static
  • 在函数内部声明,带有static

让我们依次介绍这些内容。

在函数之外声明,没有static

这是一个传统的全局符号。您可以从任何源文件访问它(尽管在其他源文件中,您通常需要 extern 声明)。

在函数外声明,static

这是您询问的“静态”全局。您只能在定义它的源文件中访问它。它是该源文件的“私有”,但您可以从该源文件中的任何函数访问它(实际上,该源文件中出现在其声明下方的任何函数)。与任何全局变量一样,它在程序的整个生命周期内都保持其值。

在函数内部声明,不带static

这是一个传统的局部变量。您只能在该函数中访问它。每次调用该函数(包括递归调用)时,您都会获得该变量的一个新实例。如果你不初始化它,它开始包含一个不可预测的值。它不会在调用之间保持其值。

在函数内部声明,static

这是一个静态局部变量。您只能在该函数中访问它。它只有一个副本,在对函数的所有调用(包括递归调用)之间共享。如果你不初始化它,它会从零开始。它在调用之间保持其值。

在这三种情况下,如果您不提供显式初始化程序,则保证将变量初始化为 0。但是对于真正的局部变量,如果您不提供显式初始化程序, 它开始包含一个不可预测的值,你不能依赖它。

这里有两个概念,visibilitylifetime。真正的全局变量在程序的任何地方都可见。静态全局变量仅在其源文件中可见。局部变量仅在其函数中可见。所有全局变量和所有静态变量都有静态持续时间——它们的持续时间与程序一样长。 (这些也是保证初始化为 0 的变量。)真正的局部变量具有“自动”持续时间——它们在调用包含函数并返回时来来去去。

与持续时间密切相关的是变量实际存储在哪里的问题。静态持续时间变量通常存储在数据段中。自动持续时间变量通常(但不一定)存储在堆栈中。

【讨论】:

  • 这是一些高质量的答案。对此,我真的非常感激。谢谢!
猜你喜欢
  • 1970-01-01
  • 2022-01-28
  • 1970-01-01
  • 2015-06-12
  • 1970-01-01
  • 2016-07-26
  • 2010-09-25
  • 2015-10-04
  • 1970-01-01
相关资源
最近更新 更多