静态变量

✍ dations ◷ 2025-09-15 23:06:30 #计算机编程,计算机科学,程序架构

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

相关

  • 语言转移语言转移也称为语言交替、语言变化、语言转换、语言迁移、语言替代(Languages shift、Language transfer、Language replacement、Assimilation),是指某语言的使用群体改用另一
  • CGa有机镓化学是研究含碳-镓键化合物的化学分支。由于镓在自然界含量稀少、分布分散,故没有同族的硼和铝研究的广泛而深入。在有机镓化合物中,镓主要以+3氧化态的形式出现,低价态
  • UOsub3/sub三氧化铀(UO3)是铀的六价氧化物,可以通过在400℃灼烧硝酸铀酰得到。它的最常见的晶型是γ-UO3,为橙黄色粉末。三氧化铀可以在400℃和二氟二氯甲烷反应,产生氯气、光气、二氧化
  • Federal Foreign Office德国外交部(德语: Auswärtiges Amt 帮助·信息,缩写:AA)掌管德国外交政策以及与欧洲联盟的关系。现任外交部长为海科·马斯,自2018年3月起,进入德国基督教民主联盟与德国社会民主
  • 镰刀镰刀是一种收割的工具,由一片弯曲的刀片(刀刃在内)和手柄组成。用时一手持手柄,刀片放平,一手持农作物禾草等,镰刀向内用力。镰刀从石器时代开始使用。铁镰刀、大镰从铁器时代出现
  • 鲸目 Cetacea鲸下目 (学名:Cetacea)旧称鲸目,是偶蹄目的演化支之一,包含了大约八十多种大型的有胎盘海洋哺乳动物,即鲸鱼﹑海豚和鼠海豚。鲸下目的现存物种可分为两个小目:齿鲸(Odontoceti)及须鲸(My
  • 塔科马塔科马(Tacoma, Washington,IPA:.mw-parser-output .IPA{font-family:"Charis SIL","Doulos SIL","Linux Libertine","Segoe UI","Lucida Sans Unicode","Code2000","Gentium",
  • 李树建李树建(1962年4月-),河南汝州人,中国豫剧表演艺术家,一级演员,工生行,善唱老生,他的唱腔朴实真切、哀婉悲怆、激情澎湃,是中华人民共和国文化部文华表演奖、中国戏剧梅花奖获得者,历任
  • 乔·贝内特办公室角色列表包含了美国情景喜剧《办公室》里的主角、常驻配角、其他配角、客串明星等在剧中的身份及描述。
  • 普林斯反应Prins反应(Prins reaction)醛或酮与烯烃或炔烃在酸催化下的缩合反应。此反应可用于制取二�烷(与过量甲醛、低温)、1,3-二醇(与甲醛、水和质子酸)、烯丙醇(无水情况下失水)、氯代醇(与