C中静态全局变量和非静态全局变量之间的区别

时间:2018-07-13 16:49:13

标签: c variables scope

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

请举例说明它们之间的区别。

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

1 个答案:

答案 0 :(得分:3)

基本上有四种情况:

  • 在函数外部声明,没有static
  • static声明在函数之外
  • 在函数内部声明,不包含static
  • 在函数内部声明,并带有static

让我们依次介绍这些。

在函数外部声明,不包含static

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

在函数外部声明,带有static

这是您要询问的“静态”全局变量。您只能在定义它的源文件中访问它。它是该源文件的“专用”,但是您可以从该源文件中的任何函数(实际上,该源文件中位于其声明下方的任何函数)访问它。像任何全局变量一样,它在程序生命周期内保持其价值。

在函数内部声明,不包含static

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

在函数内部声明,带有static

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

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

形式上,这里有两个概念,可见性寿命。真正的全局变量在程序中的任何位置都是可见的。静态全局变量仅在其源文件中可见。局部变量仅在其功能中可见。所有全局变量和所有静态变量都具有静态持续时间-它们持续的时间与程序一样长。 (此外,这些变量必须保证会初始化为0。)真正的局部变量具有“自动”持续时间-它们随着包含函数的调用和返回而不断变化。