news 2026/4/16 22:13:17

揭秘C程序内存布局奥秘

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
揭秘C程序内存布局奥秘

C程序的存储空间布局

C程序的存储空间通常分为以下几个主要部分,从低地址到高地址依次排列:

代码段(Text Segment)

代码段存放程序的机器指令,通常是只读的,防止程序意外修改指令。这部分在内存中固定,由编译器生成。

初始化数据段(Data Segment)

初始化数据段包含显式初始化的全局变量和静态变量。这些变量的初始值在编译时确定,程序加载时直接分配。

未初始化数据段(BSS Segment)

BSS段存储未初始化的全局变量和静态变量。程序加载时,操作系统将此段内存初始化为零(或空指针)。与数据段不同,BSS段不占用可执行文件的空间,仅记录大小信息。

堆(Heap)

堆用于动态内存分配,通过malloccallocrealloc等函数管理。堆空间向高地址增长,由程序员手动控制分配和释放。

栈(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; }

注意事项

  • 不同操作系统或编译器可能对内存布局有细微调整,但整体结构类似。
  • 栈和堆的碰撞可能导致程序崩溃(如无限递归耗尽栈空间)。
  • 动态链接库的加载可能影响内存映射区域的具体位置。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 22:01:18

6.【UPF】UPF Power States(UPF电源状态)

第一步&#xff1a;UPF Power States 分析与知识整理 1. 为什么学习Power States 现代SoC工作在多电源模式下&#xff1a;活跃处理、浅睡、深睡、保持模式&#xff0c;每种模式有不同的电压和功耗。UPF电源状态形式化了这些工作模式&#xff0c;使工具能够验证状态转换、按状态…

作者头像 李华
网站建设 2026/4/16 21:57:26

【可解释深度学习实战】TabNet:从理论到代码实现

1. TabNet&#xff1a;当深度学习遇上表格数据可解释性 表格数据是机器学习领域最常见的"硬骨头"——从金融风控中的用户征信数据&#xff0c;到医疗诊断中的检验指标&#xff0c;再到电商平台的交易记录&#xff0c;这些以行和列组织的结构化数据构成了现实世界决策…

作者头像 李华