核心定义
在函数内部用static修饰的变量,生命周期超过函数执行范围
核心特性
- 存储位置 存放于静态数据区(BSS/Data 段),不在栈区,程序整个运行期间一直存在;不会在每次函数调用时新建、销毁
- 初始化规则
● 不显式初始化:数值类型默认 0,指针类型默认空指针NULL
● 显式初始化:只在程序启动阶段执行 1 次,后续重复调用函数不会再次执行初始化语句 - 作用域
作用域仅限定义它的函数内部,外部不能直接访问; 但是多次调用函数之间,变量值会保留,不会重置 - 分类补充(拓展)
● 函数内static:局部静态变量
● 全局static:静态全局变量,存储同样在静态区,作用域限制为本.c 文件,其他源文件无法 extern 引用
示例代码
c
#include <stdio.h>
void test()
{
static int num = 0; // 仅第一次调用初始化一次
num++;
printf("num = %d\n", num);
}
int main()
{
test(); //输出1
test(); //输出2
test(); //输出3
return 0;
}
普通局部变量每次调用函数都会重新创建,每次都是 0;static 静态变量会保存上一次的值
易混淆点
- 生命周期:全局 > 局部 static > 普通局部变量
- 内存:普通局部变量在栈;static 变量在静态区
- 初始化时机:static 编译 / 程序启动初始化;普通局部变量运行到该行才创建
用途
● 保存函数多次调用之间的状态(计数器)
● 只初始化一次的资源
● 限制全局变量作用域在当前文件(static 全局)