“静态全局变量”和“静态全局变量”有什么区别
C 中的“非静态全局变量”?
请用一些例子解释它们有何不同。
(因为,全局静态变量和简单全局变量在整个程序中都保持活动状态,并且可以在任何块中使用。我很困惑如何区分它们。)
有人可以用代码解释一下吗?
基本上有四种情况:
- 在函数外部声明,不带
static
- 在函数外部声明,带有
static
- 在函数内部声明,不带
static
- 在函数内部声明,带有
static
让我们依次介绍这些内容。
在函数之外声明,没有static
这是一个传统的全球符号。您可以从任何源文件访问它(尽管在其他源文件中,您通常需要一个extern
宣言)。
在函数之外声明,带有static
这是您所询问的“静态”全局。您只能在定义它的源文件中访问它。它对于该源文件是“私有的”,但您可以从该源文件中的任何函数访问它(实际上,该源文件中出现在其声明下方的任何函数)。与任何全局变量一样,它在程序的生命周期内保持其值。
在函数内部声明,不带static
这是一个传统的局部变量。您只能在该函数中访问它。每次调用该函数(包括递归)时,您都会获得该变量的一个新实例。如果不初始化它,它一开始就会包含一个不可预测的值。它不会在调用之间保持其值。
在函数内部声明,带有static
这是一个静态局部变量。您只能在该函数中访问它。它只有一份副本,在该函数的所有调用(包括递归调用)之间共享。如果不初始化它,它就会从零开始。它在调用之间保持其值。
在其中三种情况下,如果您不提供显式初始化程序,则保证变量被初始化为 0。但在真正的局部变量的情况下,如果您不提供显式初始化程序,
它一开始包含一个不可预测的值,您不能依赖它。
形式上,这里有两个概念,能见度 and lifetime。真正的全局变量在程序中的任何位置都是可见的。静态全局变量仅在其源文件中可见。局部变量仅在其函数中可见。所有全局变量和所有静态变量都有静态持续时间——它们的持续时间与程序一样长。 (这些变量也保证被初始化为 0。)真正的局部变量具有“自动”持续时间——它们随着包含函数的调用和返回而出现和消失。
与持续时间密切相关的是变量实际存储在哪里的问题。静态持续时间变量通常存储在数据段中。自动持续时间变量通常(但不一定)存储在堆栈中。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)