C程序在内存中的空间布局主要包括以下几个部分:
代码段(正文段)
这是由CPU执行的机器指令部分。
通常情况下,正文段是可以共享的,子进程和父进程会共同维护内存中的一个副本。
正文段一般也是只读的,以防止程序由于意外而修改其本身。
其中包含了只读的常量,比如字符串常量等。
数据段
数据段包含了程序中已初始化的全局变量和静态变量。
数据段属于静态分配内存,其存储空间在程序编译时分配,并在程序执行期间一直存在,程序结束后由系统释放。
栈(动态内存区)
栈也存放程序运行期间用到的数据,其存储空间在程序运行期间由编译器自动分配和释放。
栈的生命周期短于程序的运行期,通常用于存储局部变量、函数参数和返回地址等。
堆
堆用于动态内存分配,存储通过`malloc`等函数分配的区域。
堆中的数据在程序运行期间存在,程序结束时由系统释放。
非初始化数据段(BSS段)
在程序开始执行之前,内核将此段中的数据初始化为0或空指针。
非初始化数据段包含了程序中未明确赋初值的变量。
综上所述,C程序在内存中的空间布局包括代码段、数据段、栈、堆和非初始化数据段。每个部分在程序运行期间扮演着不同的角色,共同协作以支持程序的执行。