静态变量

✍ dations ◷ 2025-10-12 04:05:55 #计算机编程,计算机科学,程序架构

静态变量(英语: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++中,带有含私有静态内部变量的类的程序如下所示:

相关

  • 普鲁士蓝普鲁士蓝(英语:Prussian blue;德语:Preußisch Blau 或 Berliner Blau;化学名称:亚铁氰化铁;分子式:Fe7(CN)18⋅14H2O,或书写成Fe43 · xH2O简称:PB)是一种深蓝色的颜料,在画图和青花瓷
  • 脊椎骨脊柱(拉丁语:Columna vertebralis、英语:vertebral column、backbone、spine)是脊椎动物位于背侧的支撑性中轴骨骼。人类的脊柱由23-24块脊椎骨(拉丁语:Vertebrae)和中间起缓冲作用
  • 威廉·萨克雷威廉·梅克比斯·萨克雷(William Makepeace Thackeray,1811年7月18日-1863年12月24日)是一位与狄更斯齐名的维多利亚时代的英国小说家。最著名的作品是《名利场》(一译《名利场》
  • 南象海豹南象海豹(学名:Mirounga leonina),又名南象形海豹,主要分布在亚南极地区,是象海豹属下的两种海豹之一。它不仅是最庞大的鳍足类动物,而且还是迄今为止食肉目最大的成员。该海豹的名
  • 非维生素辅因子(英语:cofactor)指与酶(酵素)结合且在催化反应中必要的非蛋白质化合物。某些分子如水和部分常见的离子所扮演的角色和辅因子相当类似,但由于含量不受限制且普遍存在,因此不归
  • 曾母暗沙曾母暗沙(英语:James Shoal,詹姆斯暗沙;马来语:Beting Serupai)亦称詹姆沙,是一座位于南海、终年不露出水面的海底暗沙,被视为南沙群岛的一部分,马来西亚、中华民国及中华人民共和国
  • b̪v浊唇齿塞擦音(voiced labiodental affricate、国际音标符号:)是一个相对少见的塞擦音,由浊唇齿塞音 和浊唇齿擦音 组成。对应的清音为清唇齿塞擦音 。当符号成对出现时,左边的
  • 买凶杀己买凶杀己,是一种特殊形式的自杀。死者通常死意坚定,且背负高额债务。企图伪装成意外死亡或被谋杀,诈领保险金给受益人。凶手受死者所托,为死者行加工自杀,而非谋杀。因此保险公司
  • 因弗克莱德因弗克莱德(英语:Inverclyde),是英国苏格兰的32个一级行政区之一,也是面积和人口数量都非常小的区域。它地处苏格兰主要河流克莱德河入海口,历史上曾经是苏格兰乃至英国最重要的造
  • 三楚三楚,分成西楚、东楚与南楚等,为秦汉之间的古地名。三楚本指楚国强盛时期的地理范围,到后来成为楚文化概念。直至东汉时期,依然为时人所使用。南北朝后泛指湖南、湖北一带。战国