什么是全局变量?什么是局部变量?
全局变量 vs 局部变量
1. 全局变量(Global Variable)
- 定义位置:在函数外部定义。
- 作用域:从定义处开始,到整个程序结束均可访问。
- 生命周期:程序启动时创建,程序结束时销毁。
- 存储位置:
- 初始化过的全局变量 →
.data
段。 - 未初始化的全局变量 →
.bss
段(默认初始化为0
)。
- 初始化过的全局变量 →
- 示例:
#include <stdio.h> int global_var = 10; // 全局变量(初始化) int main() { printf("%d\n", global_var); // 输出 10 return 0; }
2. 局部变量(Local Variable)
- 定义位置:在函数或代码块(如
{}
)内部定义。 - 作用域:仅在其所在的函数或代码块内有效。
- 生命周期:函数调用时创建,函数返回时销毁。
- 存储位置:栈(Stack),内容未初始化时为随机值。
- 示例:
#include <stdio.h> void func() { int local_var = 20; // 局部变量 printf("%d\n", local_var); // 输出 20 } int main() { func(); // printf("%d\n", local_var); // 错误!local_var 在此不可见 return 0; }
关键区别
特性 | 全局变量 | 局部变量 |
---|---|---|
定义位置 | 函数外部 | 函数或代码块内部 |
作用域 | 整个程序 | 仅限定义它的函数/代码块 |
生命周期 | 程序运行期间 | 函数调用期间 |
默认初始化 | 初始化为 0 (未显式初始化) |
未初始化时为随机值 |
存储区域 | .data 或 .bss 段 |
栈(Stack) |
为什么未初始化的局部变量是随机的?
- 栈内存由编译器动态管理,不会自动清零(为了效率)。
- 局部变量的内存空间可能被之前其他函数使用过,残留数据即为“垃圾值”。
- 示例:
#include <stdio.h> int main() { int x; // 未初始化的局部变量 printf("%d\n", x); // 输出随机值(如 32767、0、-1等) return 0; }
如何选择?
- 用全局变量:
需要跨函数共享数据,且生命周期覆盖整个程序运行时(慎用,易导致代码耦合)。 - 用局部变量:
临时存储数据,避免命名冲突,提高代码模块化。
一句话总结
- 全局变量:定义在函数外,全程序可见,默认初始化为
0
。 - 局部变量:定义在函数内,仅局部可见,未初始化时值为随机。