揭秘C程序内存布局奥秘

张开发
2026/4/16 22:13:19 15 分钟阅读

分享文章

揭秘C程序内存布局奥秘
C程序的存储空间布局C程序的存储空间通常分为以下几个主要部分从低地址到高地址依次排列代码段Text Segment代码段存放程序的机器指令通常是只读的防止程序意外修改指令。这部分在内存中固定由编译器生成。初始化数据段Data Segment初始化数据段包含显式初始化的全局变量和静态变量。这些变量的初始值在编译时确定程序加载时直接分配。未初始化数据段BSS SegmentBSS段存储未初始化的全局变量和静态变量。程序加载时操作系统将此段内存初始化为零或空指针。与数据段不同BSS段不占用可执行文件的空间仅记录大小信息。堆Heap堆用于动态内存分配通过malloc、calloc、realloc等函数管理。堆空间向高地址增长由程序员手动控制分配和释放。栈Stack栈用于存储函数调用时的局部变量、参数和返回地址。栈空间向低地址增长由编译器自动管理。栈的分配和释放遵循后进先出LIFO原则。内存映射区域Memory Mapping Segment内存映射区域用于加载动态库或文件映射如mmap系统调用。该区域的位置和大小取决于系统和程序需求。示例代码验证布局#include stdio.h #include stdlib.h int global_init 10; // 数据段 int global_uninit; // BSS段 int main() { static int static_init 20; // 数据段 static int static_uninit; // BSS段 int local_var; // 栈 char *heap_var malloc(100); // 堆 printf(代码段地址: %p\n, main); printf(数据段地址: %p\n, global_init); printf(BSS段地址: %p\n, global_uninit); printf(堆地址: %p\n, heap_var); printf(栈地址: %p\n, local_var); free(heap_var); return 0; }注意事项不同操作系统或编译器可能对内存布局有细微调整但整体结构类似。栈和堆的碰撞可能导致程序崩溃如无限递归耗尽栈空间。动态链接库的加载可能影响内存映射区域的具体位置。

更多文章