- 可执行程序被加载到内存后在内存中的分段存储
- 分段存储的原因
程序在运行过程中,指令是依次执行的,只需要执行一次(跳转、递归的操作会执行多次),而数据一般是需要多次访问的,因此分段存储便于访问。
2. 在内存中的具体分段名称
代码段:又称文本段(text segment),存放程序执行指令的内存区域。特点:只 读,大小在编译器编译链接时自动计算得到,属于静态内存分配。
数据段:data segment,存放已初始化的全局变量和静态变量,属于静态内存分配。
BSS段:BSS segment,BSS全名是Block Started by Symbol(以符号开始的块),存 放未初始化的全局变量和静态变量,特点:可读写,在程序执行之前BSS 段会自动清零,所以未初始化的全局变量和静态变量在程序执行前就已经 是0了,属于静态内存分配。
堆(Heap):存放程序运行过程中被动态分配的内存区域,特点:大小不固定, 可动态扩张或缩减,在内存中位于BSS段和栈之间,属于动态内存分 配。
栈(Stack):存放程序中的局部变量、参数及返回值,属于静态内存分配。
- main函数执行前发生的事情
程序被加载到了内存中之后要去执行,先从main函数开始,但是在进入main函数之前是需要做一些工作的,包括以下的几个方面:
- 设置栈指针。
- 初始化全局变量和静态变量。
- 将未初始化的全局变量和静态变量赋初值,数值型short,int,long等为0,bool为FALSE,指针为NULL,等等。
- 全局对象初始化,在main函数之前调用构造函数。
- 将argc、argv传递给main函数,然后开始执行main函数。