静态变量

✍ dations ◷ 2025-12-02 02:00:22 #计算机编程,计算机科学,程序架构

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

相关

  • 后述心电图(Electrocardiography、ECG 或者 EKG)是一种经胸腔的以时间为单位记录心脏的电生理活动,并通过皮肤上的电极捕捉并记录下来的诊疗技术。这是一种无创性的记录方式。Elect
  • 超心理学超心理学(英语:parapsychology,又称为心灵学、灵魂学),主要研究一系列被称为的超自然现象,主要包括濒死体验、轮回、出体、前世回溯、传心术、预言、遥视和意念力等。研究在实验室
  • 理论计算机科学理论计算机科学(英语:theoretical computer science,缩写为TCS)是计算机科学的一个分支,它主要研究有关计算的相对更抽象化,逻辑化和数学化的问题,例如计算理论,算法分析,以及程序设
  • 外消旋体外消旋混合物(英语:racemic mixture、racemate,或称为 外消旋体)是等物质的量的一对对映体混合后得到的组成物。第一个制得的外消旋体是路易·巴斯德制得的酒石酸的外消旋混合物
  • 1961年 索非亚第二届夏季世界大学生运动会于1961年8月25日至9月3日在保加利亚索非亚举行。共有32个国家,1270名运动员参加。这是世大运第一次在社会主义国家举行。男子跳高:苏联选手瓦莱里
  • 北索美塞特北索美塞特(英语:North Somerset)是英格兰的一个非都市区,范围包括了索美塞特郡的西北部。北索美塞特成立于1996年,在成立之初政府计划将该区命名为西北索美塞特,但议会投票决定选
  • 杰里·沃里斯霍勒斯·杰里迈亚·“杰里”·沃里斯(英语:Horace Jeremiah "Jerry" Voorhis,1901年4月6日-1984年9月11日)是一位来自美国加利福尼亚州的民主党政治家。从1937至1947年,他共计5次
  • 旧莱姆 (康涅狄格州)旧莱姆(英语:Old Lyme)是一个位于美国康涅狄格州新伦敦县的城镇。旧莱姆的座标为41°19′00″N 72°28′00″W / 41.31667°N 72.46667°W / 41.31667; -72.46667,而该地的平均
  • 诺伦三女神诺伦三女神或诺恩三女神(或省掉“三女神”三字。古诺斯语:;英语:The Norns或是复数形nornir),是北欧神话中的命运女神。诺伦三女神是智慧巨人密米尔的三个女儿,另一说是巨人诺尔维(
  • 三石琴乃三石琴乃(日语:三石 琴乃/みついし ことの ,1967年12月8日-,日本女性配音员、旁白。出身于东京都。身高160cm。A型血。三石现为自由身,以前是ARTSVISION所属。胜田声优学院(日语:勝