静态变量

✍ dations ◷ 2025-11-16 18:00:00 #计算机编程,计算机科学,程序架构

静态变量(英语:Static Variable)在计算机编程领域指在程序执行前系统就为之静态分配(英语:Static memory allocation)(也即在运行时中不再改变分配情况)存储空间的一类变量。与之相对应的是在运行时只暂时存在的自动变量(即局部变量)与以动态分配方式获取存储空间的一些对象,其中自动变量的存储空间在调用栈上分配与释放。

“静态变量”这一术语有两个容易混淆的定义:

而在以Pascal为代表的许多程序语言中,所有局部变量都由系统自动分配存储空间,而所有全局变量的存储空间则以静态分配的方式获取(对应“静态变量”),因此由于实际上“局部变量”和“全局变量”这两个术语已足以涵盖所有的情况,在这些程序语言中通常不使用“静态变量”这一术语,而直接以“全局变量”代之。一般来说,在这些程序语言中,静态变量就是全局变量,而即使在有明确区分全局和静态变量的程序语言中,在编译后的代码里二者也以相同的方式获取存储空间。而今术语“静态变量”的概念则主要基于C族语言的“static”的定义(即定义2)。

静态变量也可以用于存储常数。具体来说,静态变量(全局变量及汇编语言里定义的符号亦同)可用const,constant或final(根据语言决定)等关键字标识,这时其值就会在编译时设定,并且无法在运行时改变。编译器通常将静态常量与文本一起置于目标文件的文本区域,而非常量初始化数据则置于数据区;而如若有需要,有些编译器还可选择为其开辟专用区;为防止常数变量被错误的指针写入覆盖,亦可在这块区域启用内存保护机制。

在C语言及由其派生出的C++与Objective-C等程序语言中,“static”是用于控制变量的生命周期和连接方式(即其作用域,亦即可见性)的保留字。确切来说,正如C族语言中的extern,auto与register这些保留字一样,static也是一种存储类(此处的“类”与面向对象语言的“类”的定义不同)标识。每个变量与函数都有以上的一种存储类标识,如果在声明(英语:Declaration (computer programming))中没有明确标识其存储类,编译时就会根据上下文来选择其默认存储类,如在源文件里的所有文件级变量对应的默认存储类是extern,而在函数体内的变量对应的则是auto,各存储类的属性如下表所列。

易见存储类为extern的变量(包括上面提到的未明确声明存储类的文件级变量)符合前段所述静态变量的定义1,但不符合定义2。

除明确标识出变量的生命周期(英语:Object lifetime)外,将变量声明为static存储类还会根据变量属性不同而有一些特殊的作用:

在C语言中,带有静态变量的程序如下所示:

#include <stdio.h>void func() {	static int x = 0; // 在对func的三次调用中,x只进行一次初始化	printf("%d\n", x); // 输出x的值	x = x + 1;}int main(int argc, char * const argv) {	func(); // 输出0	func(); // 输出1	func(); // 输出2	return 0;}

C++示例

在C++中,带有含私有静态内部变量的类的程序如下所示:

相关

  • 肝糖储积症肝糖储积症(英语:Glycogen storage disease)属于一种合成、分解肝糖有缺陷的代谢疾病。另外,肝糖只分布于肝脏、肌肉。造成肝糖储积症的病症有两种,即先天与后天。先天型肝糖储积
  • Fe(NOsub3/sub)sub3/sub硝酸铁、硝酸铁(III)是铁(III)的硝酸盐,化学式为Fe(NO3)3·9H2O,相对分子质量为403.99。它是无色至暗紫色的潮解性晶体,可通过铁或氧化铁与硝酸反应制备。硝酸铁催化钠的液氨溶
  • 库安多古班哥省宽多-库邦戈省位于安哥拉东南端,与比耶省、库内纳省、威拉省、莫希科省等省份及纳米比亚、津巴布韦相邻。
  • 高晓松北京市石油部北郊子弟小学(西城区师范学校附属小学)高晓松(1969年11月14日-),祖籍浙江杭州,出生于松辽油田(今黑龙江省大庆市)。作曲、填词人、音乐制作人、导演、作家以及脱口秀主持
  • 介之推介子推(?-前636年),一作介之推,又称介子、介推,春秋时期晋国人,逝世于介休绵山(今山西介休市)。晋文公重耳的辅臣,骊姬之乱发生后,他跟随重耳出奔,历尽艰辛,忠心辅佐重耳得以返国,介子推却
  • 爱丽丝·鲍尔爱丽丝·鲍尔(英语:Alice Augusta Ball,1892年7月24日-1916年12月31日),全名爱丽丝·奥古斯塔·鲍尔,是非裔美国化学家,提炼出可以注射的油类萃取物,是1940年代之前最有效的痳疯用药,
  • 清水公学校台中市清水区清水国民小学(简称清水国小)是中华民国(台湾)台中市清水区最早成立的市立国民小学。
  • 口头语口头语,与书面语相对,是口头交际时使用的语言,是最早被人类普遍应用的语言形式。人类各民族都有口头语。口头语通常是通过声音传播的,但有时文学作品中也常以文字记叙口头语。
  • 比那尔德里奥省比那尔德里奥(西班牙语:Provincia de Pinar del Río)是古巴最西部的省份,该省也是著名的旅游区,首府为比那尔德里奥,该省省名也来源于瓜马河流两岸的松林。
  • 虫笼的卡伽斯特尔《虫笼的卡伽斯特尔》(日语:虫籠のカガステル)是日本漫画家桥本花鸟创作的日本漫画作品。2005年9月14日于作者个人网站“チキンの魂”以桥本チキン为笔名进行创作,2013年4月26日