一个可执行程序至少包含:代码段 + 数据段 + BSS 段
1 代码段
代码段在内存中被映射为只读。它是由编译器在编译链接时自动计算的。通常是用来存放程序执行的指令。代码段输入静态内存分配。
2 数据段
通常用来存放程序中已初始化的(非 0)全局变量和静态局部变量。数据段的起始位置由链接定位文件确认,大小在编译链接时自动分配。数据段属于静态内存分配。
3 BSS 段
bss 是英文 Block by Symbol 的简称。通常用来存放程序中未初始化和初始化为 0的全局变量的一块内存区域,在程序载入时由内核清零。数据段属于静态内存分配。
4 栈
一个函数内定义的局部变量、传递的实参都是保存在栈中的。
当我们在Shell交互环境下运行./hello时,bash会解析我们的命令和参数,调用fork创建一个子进程,接着调用exec()函数将hello可执行文件的代码段、数据段加载到内存,替换掉子进程的代码段和数据段。
#include <stdio.h>
int main(void){
printf("hello world\n");
while (1);
return 0;
}
ps
$ pstree -h 4564
bash─┬─helloworld
└─pstree
全局变量的作用域:
● 全局变量的作用域由文件来限定。
● 可使用extern进行扩展,被其他文件引用。
● 也可以使用static进行限制,只能在本文件中被引用。
局部变量的作用域:
● 局部变量的作用域由{}限定。
● 可以使用static修饰局部变量来改变它们的存储属性(生命周期),但不能改变其作用域。