内存中的程序
- 只读部分
- 程序中的代码
- 程序中的常量
- 可读写部分
- .data: 初始化了的全局变量和静态变量
- .bss(Block Started by Symbo):未初始化的全局变量和静态变量
- heap: 使用 malloc, realloc, 和 free 函数控制的变量
- stack: 函数调用时使用栈来保存函数现场,自动变量
静态变量 & 全局变量
全局变量
:代码中的变量,要么定义在函数外,要么定义在函数里。定义在函数外的变量就有了全局的作用域,成了全局变量,全局变量不仅在整个文件中有作用,而且在其他文件中也有作用,称作链接性。
a.c
#include <stdio.h>
int a;
int compute(void);
int main()
{
a = 1;
printf("%d %d\n", a, compute());
return 0;
}
b.c
int a;
int compute(void)
{
a = 0;
return a;
}
在链接过程中会产生重复定义错误,原因是有两个全局变量a
,为了避免这种情况,需要引入static
。
静态变量
:指使用 static 关键字修饰的变量,static 关键字对变量的作用域进行了限制,使得变量仅在源文件内有效。
- static在函数外:static全局变量
- static在函数内:static局部变量
对于static局部变量,在其他文件调用本文件内函数修改其值时候,变量的值不会丢失;普通局部变量都是重新分配,而静态局部变量保持上次调用的值不变。
注意:'静态'这个中文翻译实在是有些莫名其妙,给人的感觉像是不可改变的,而实际上 static 跟不可改变没有关系,不可改变的变量使用 const 关键字修饰,注意不要混淆。