解码C语言程序内存分布

虚拟内存概念

核心概念:每一个进程运行时,操作系统都会为其分配一块虚拟内存空间(一般4G大小)

  • 目的:让开发者不再关心物理内存的具体处理
  • 效果:每个进程都认为自己拥有完整且独立的内存空间

布局图示

栈内存 (Stack)

存储内容:

  • 命令行参数
  • 各个函数的局部变量
  • 函数调用的返回地址

内存特性:

  • 地址增长方向:从高地址向低地址增长
  • 释放方向:从低地址向高地址释放
  • 管理方式:系统自动管理
    • 函数调用时自动申请
    • 函数退出时自动释放
  • 大小限制:默认较小(通常为8MB)

堆内存 (Heap)

存储内容:

  • 任意数据(动态分配的内存)

内存特性:

  • 理论增长方向:从低地址向高地址增长
  • 实际分配方式:根据内存碎片情况灵活分配
  • 管理方式:开发者完全自主管理
    • 需要手动申请 (malloccallocrealloc)
    • 需要手动释放 (free)
  • 主要风险:内存泄漏问题

数据段 (Data Segment)

存储内容:所有静态数据

  • 生命周期:随进程启动而创建,随进程退出而释放

数据段细分:

段名 存储内容 特点
.bss 未初始化的静态数据 默认初始化为0
.data 已初始化的静态数据 包含显式初始值
.rodata 只读数据 常量字符串、const变量等

代码段 (Text Segment)

  • 地址:通常从 0x08048000 开始
  • 内容:程序的可执行指令
  • 属性:只读、可执行

数据段细分:

段名 存储内容 特点
.text 用户代码 程序执行代码
.init 初始化代码 程序启动初始化代码
posted @ 2025-09-19 16:21  YouEmbedded  阅读(24)  评论(0)    收藏  举报