C程序由以下几部分组成:正文段 初始化数据段 非初始化数据段 栈 堆
正文段: 这是由cpu执行段机器指令部分,正文段是可共享的,正文段通常是只读的
初始化数据段: 通常称为数据段,它包含了程序中需要明确赋初值的变量,例如,C程序中出现在任何函数之外的声明:int maxcount = 99; 此变量带有初值存放在初始化数据段中
非初始化数据段:通常称为bss段,在程序开始执行前,内核将此段中段数据初始化为0或空指针。出现在任何函数外段C声明long sum[1000];此变量存放在非初始化数据段中
栈: 自动变量以及每次函数调用时所需要保存的信息都存放在此段中。每次调用函数时,其返回值地址以及调用者的环境信息,都存放在栈中,最近被调用的函数在栈上为其自动和临时变量分配内存空间。通过以这种方式使用栈,可以递归调用C函数。递归函数每次调用自身段时候,就使用一个新段栈帧,因此一个函数调用实例中的变量不会影响另一个函数调用实例中的变量。
堆:通常在堆中进行动态内存分配。堆位于非初始化数据段和栈之间。
栈是从高地址向低地址方向增长,堆是从低地址向高地址方向增长。
堆顶和栈低之间未用的虚地址空间很大。
未初始化数据段并不存放在磁盘的程序文件中,内核在开始运行程序之前把它们都设置为0