先说结论
- 已初始化存储在.data节,未初始化存储在.bss节,不管是否初始化,static关键字修饰的变量不允许外部引用。
总结
- 普通全局变量可被外部引用,
- static全局变量不可被外部引用
- 局部变量不可被外部引用
验证
1. main.c如下
static int global_var1 = 1;
static int global_var2;
int fun(){
static int inner_var1 = 3;
int inner_var2 = 4;
return 0;
}
cc -o main.o -c main.c
编译
2. nm命令查看.symtab
nm -f sysv -n main.o
三. 输出分析
1. static存储位置
- 新概念:Class里,小写字母全部为本地作用域
- 可用看出func可以被外部引用,存放在.text中
- global_var 和 global_var2因为均有static修饰,所以统统是小写
- 同时global_var1是初始化的,所以放在了.data节,var2没有初始化,所以放在了.bss节
2. 改名的变量
3. 消失的变量
- 我们定义的
inner_var2
怎么没了? - 符号表
.symtab
存放全局符号和static符号,其他局部变量不存储。
4. 如何引用局部变量?
C++里这是不可能的。
实际上,局部变量没有名字,观察如下汇编语句我们可以发现,只是一些内存分配而已,
- 这是显然的,既然不能被外部引用,给它定义一个名字放入符号表就没有意义。
5. 全局和函数内可以有同名的static变量吗?
- 验证发现,完全可以,会给某一个static分配一个新的名字,类似于对重载函数的处理。