静态变量

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

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

相关

  • 百日咳杆菌百日咳博德特氏杆菌(Bordetella pertussis)是一种革兰氏阴性、好氧性、博德氏菌属的球杆菌(一说是短杆菌,见参考来源2),而且是百日咳的病原体。百日咳杆菌在特定条件下可以产生鞭
  • 淫乐杀人淫乐杀人(英语:lust murder,日语:快楽殺人),又名异常快乐杀人,指为了获得某种快感,或心理上的满足或补偿所犯下的杀人行为。有的罪犯是以追求性快感为目的,也叫做性犯罪杀手,而其它原
  • 计重秤计重秤,俗称秤、称或磅,泛指量度物体质量的工具,间中也会用作测量力量。使用杠杆原理的天平是最原始的计重秤。现在的计重秤已经电气自动化。
  • 碳足迹碳足迹亦译碳足印,盖指每个人、家庭或每家公司日常释放的温室气体数量(以二氧化碳即CO2的影响为单位),用以衡量人类活动对生态环境的影响。根据以下步骤,可以有效减少碳足迹:最后
  • 期刊引证报告期刊引证报告(Journal Citation Reports,JCR)是由科睿唯安(Clarivate Analytics)所发表的年度出版物(原汤森路透知识产权与科技事业部)。它透过该公司旗下Web of Science(英语:Web of
  • 戴维·李戴维·李可以指:
  • 巴黎十三区巴黎十三区(法语:13e arrondissement de Paris)是法国首都巴黎市的20个区之一。该区处于巴黎左岸。十三区里有巴黎的三个华人区之一。
  • 1970年被中华人民共和国处决的死刑犯列表1970年被中华人民共和国处决的死刑犯列表,旨在列出1970年被中华人民共和国处决的死刑犯。
  • 路易斯·范加尔路易斯·范加尔(荷兰语:Louis van Gaal,( Louis van Gaal 帮助·信息,1951年8月8日-),荷兰著名足球教练、退役足球运动员,曾任教荷甲俱乐部阿贾克斯和阿尔克马尔、西甲俱乐部巴塞罗
  • 死亡笔记角色列表本列表是由大场鸫原作、小畑健作画的日本漫画《死亡笔记》及其改编的作品中登场的角色列表。因为有许多美国罪犯被基拉杀死,因此联邦调查局同意协助L,但在几个联调局的探员被