static全局变量 vs 普通全局变量
1. 作用域(最核心区别)
- 普通全局变量:作用域是整个工程。
在A.c定义,其他 .c 文件可以用 extern 声明,跨文件访问这个变量。
- static全局变量:作用域仅限当前这个.c源文件,其他源文件无法访问,extern也拿不到。
static 修饰全局变量,本质是限制作用域为本文件,不导出符号。
2. 存储位置
✅ 两者完全一样:都存放在静态存储区(全局数据段),不是栈。
程序启动时分配内存,程序结束才释放,生命周期都是整个程序运行周期。
3. 初始化
- 如果没有手动初始化:两者默认自动初始化为0。
- 只初始化一次,在main函数执行之前完成。
4. 多文件同名冲突
- 普通全局变量:多个 .c 定义同名全局变量 → 链接报错(重复定义)
- static全局变量:每个文件各自的static全局变量,同名互不干扰,独立变量,不会冲突。
5. 一句话总结考点
全局变量加static:生命周期不变,仅把作用域缩小到当前源文件,不能跨文件引用。
代码示例
c
// file1.c
int g_a; //普通全局变量,别的文件extern可以访问
static int g_b; //static全局变量,仅file1.c内部可用
// file2.c
extern int g_a; //OK,可以拿到g_a
extern int g_b; //❌ 编译/链接报错,g_b对外部不可见
拓展对比(顺带区分 static局部变量)
static局部变量:作用域仍在函数内,但是生命周期变成全局(静态区),只初始化一次。