静态变量

✍ dations ◷ 2025-11-08 02:03:47 #计算机编程,计算机科学,程序架构

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

相关

  • 中子俘获中子俘获是一种原子核与一个或者多个中子撞击,形成重核的核反应。由于中子不带电荷,它们能够比带一个正电荷的质子更加容易地进入原子核。在宇宙形成过程中,中子俘获在一些质量
  • 共时语言学共时语言学(英语:synchronic linguistics),又称静态语言学,是由索绪尔创立的一套语言学方法,其特点是对某个语言现象只在一个给定的时间段内进行研究(通常是现在,但也可以是历史上的
  • 秘鲁南美洲各国关于2019冠状病毒病疫情的病例和其对应措施。2月25日,据巴西《圣保罗州报》报道,巴西圣保罗市当天发现了首例新冠病毒核酸检测呈阳性的病例。巴西卫生部称,该病例为
  • 动物囤积症动物囤积症(英语:animal hoarding)是指在一定范围内囤积了超过一般常见数量之动物,却没有能力安置照料这些动物。这种囤积症为虐待动物之行为,但更精确来说可被视为一种精神病的
  • span class=nowrapRaClsub2/sub/span氯化镭,化学式RaCl2,是第一种被制出的镭化合物,由玛丽·居里制得。金属镭最初由汞电极电解氯化镭溶液制得。氯化镭在溶液中结晶生成二水合物(RaCl2·2H2O)。在空气中100°C加热
  • 维多利亚湖维多利亚湖(英文:Lake Victoria,又名Victoria Nyanza)是非洲最大的淡水湖和世界第二大淡水湖,面积68,870平方公里,仅次于苏必略湖,也是世界上最大的热带淡水湖。如果依含水量来比较
  • 胞内体胞内体(英语:Endosome,又称内体)在细胞生物学中指的是一种真核细胞中的膜结合细胞器,属于一种囊泡结构。作为细胞内吞作用中运载途径的一个区室,胞内体从细胞质膜被传递到溶酶体被
  • 西班牙国家图书馆西班牙国家图书馆(西班牙语:Biblioteca Nacional de España)是西班牙的国家图书资讯机构,也是西班牙最大的图书馆,位于马德里的雷科莱托斯大道。1712年,西班牙国王腓力五世创建了
  • 奠基石奠基石是一种在建筑物奠基时安放在外墙上的石块,上面刻有纪念奠基的铭文。有些奠基石并不是实心,而是内藏一个空间放置时间囊,待建筑物拆卸时,时间囊才得以重见天日。在中国文学
  • 1,2,3,4-苯四甲酸1,2,3,4-苯四甲酸是一种羧酸类有机化合物,化学式为C10H6O8。它和一些金属化合物(如氯化钴、硝酸银、乙酸锌等)在水热条件下进行反应,可以生成金属有机框架材料。