静态变量

✍ dations ◷ 2025-12-01 00: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++中,带有含私有静态内部变量的类的程序如下所示:

相关

  • 陶文 ‧ 甲骨文 ‧ 金文 ‧ 古文 ‧ 石鼓文籀文 ‧ 鸟虫书 ‧ 篆书(大篆 ‧  小篆)隶书 ‧ 楷书 ‧ 行书 ‧ 草书漆书 ‧  书法 ‧ 飞白书笔画 ‧ 
  • 聚丙烯腈聚丙烯腈(英文:Polyacrylonitrile,PAN)是由单体的丙烯腈经过自由基聚合反应而得到高分子材料。聚丙烯腈为白色粉末状,密度为1.14-1.15g/cm。常压下,220-300℃时会软化分解。纯聚丙
  • 托德亚历山大·罗伯图斯·托德,托德男爵,OM,FRS(苏格兰盖尔语:Alexander Robertus Todd, Baron Todd,1907年10月2日-1997年1月10日),出生于格拉斯哥,苏格兰化学家,1957年获诺贝尔化学奖。19
  • 法国航空447号班机空难法国航空447号班机原定由巴西里约热内卢加利昂国际机场飞往法国巴黎戴高乐机场。2009年6月1日,该航班一架空中客车A330-203客机(注册编号:F-GZCP),载有216名乘客以及12名机组人员
  • 瓦埃勒瓦埃勒 (丹麦语:Vejle,丹麦语发音: )是位于丹麦南丹麦大区的一个城市。2008年时,瓦埃勒有人口50,213人,整个瓦埃勒自治市有人口104,933人。是南丹麦大区和瓦埃勒自治市地方议会所
  • 水势水势指相对于纯水而言某种状态下的单位体积的水的势能,一般用ψ表示。水势描述了水由于渗透、重力、机械压力或基体效应(如毛细作用)从一个地方流动到另一个地方的趋势。水势这
  • 鸟龙鸟鸟龙鸟属(属名:Avisaurus,意为“鸟蜥蜴”)是白垩纪晚期北美洲的一属反鸟亚纲鸟类。其下仅有一个物种,即模式种阿氏鸟龙鸟(A. archibaldi)。两者都只有一条跗跖骨化石。鸟龙鸟是来自
  • 八大综合台八大综合台(又称:GTV综合台),是八大电视旗下的频道之一。2015年9月14日起启用高清版本“八大综合台HD”;2016年8月17日起提供双语服务。(需申装有线电视数位机上盒方能切换)
  • ST段上升ST段上升(ST elevations)描述的是心电图中ST节段较基准线异常上升的征象。若肢导极在J点(英语:J-point)后0.04秒的基准线上升大于 0.1 mV (一小格),或胸前导程基准线上升大于 0.2 mV
  • 一号防空坦克一号防空坦克是德国于1940年代研制的一款防空坦克,其官方军械署赋予的编号为Sd.Kfz. 101(“第101号特殊用途车辆”)在1941年以前,德国的防空坦克都是以半履带车底盘为基础,尽管半