尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

C语言程序的内存地址分配

C语言程序的内存地址分配
📅 发布时间:2026/7/21 6:49:56

当一个C程序被编译为可执行程序,我们运行这个可执行程序时,系统会为这个程序分配一个虚拟内存,以下就是其分配详情(不同的操作系统分的内存大小可能不同,但是顺序都是一样的,只不过每个区域的大小不一)

高地址 ┌─────────────────────┐ 0xFFFFFFFF
│ 内核空间 │ (操作系统占用,用户程序无法访问)
│ (1GB,供内核使用) │
├─────────────────────┤ 0xC0000000(3GB 边界)
│ │
│ 栈区 ↓ │ ← 向下增长(从高地址向低地址)
│ (局部变量、形参) │
├─────────────────────┤
│ │
│ 空洞 │ ← 栈和堆之间的大片空闲区域
│ (可动态调整) │
│ │
├─────────────────────┤
│ 堆区 ↑ │ ← 向上增长(从低地址向高地址)
│ (malloc/calloc 分配)│
├─────────────────────┤
│ .bss段 │ ←未初始化的全局/静态变量(默认值为0)
│ │
├─────────────────────┤
│ .data段 │ ←已初始化的全局/静态变量(有初始值)
│ │
├─────────────────────┤
│ .rodata段 │ ←只读数据(字符串常量、const 修饰的变量)
│ │
├─────────────────────┤
│ .text段 │ ← 代码段(程序的机器指令,只读)
│ (程序指令/机器码) │
│ │
低地址 └─────────────────────┘ 0x08048000(Linux 默认加载地址)

1. 代码段(.text,只读)

  • 存放内容:程序的机器指令(CPU 执行的二进制代码)

  • 权限:只读(防止程序意外修改自己的指令)

  • 生命周期:程序启动到结束,一直存在

  • 举例:你写的printf("hello");编译后就在这里

// 函数体编译后存放在 .text 段
void func() {
int a = 10; // 函数指令在这里,但变量 a 在栈上
}

2. 只读数据段(.rodata,常量区)

  • 存放内容:字符串常量、const修饰的全局变量

  • 权限:只读(修改会导致段错误)

  • 生命周期:程序启动到结束,一直存在‘

char *str = "hello"; // "hello" 存放在 .rodata 段
const int num = 100; // num 存放在 .rodata 段(全局 const)

3. 数据段(.data,已初始化数据段)

  • 存放内容:已经初始化的全局变量、静态变量(初始值不为 0)

  • 权限:可读写

  • 生命周期:程序启动到结束,一直存在

int global = 100; // 存放在 .data 段
static int count = 5; // 存放在 .data 段

4. BSS 段(.bss,未初始化数据段)

  • 存放内容:未初始化的全局变量、静态变量(默认值为 0)

  • 权限:可读写

  • 生命周期:程序启动到结束,一直存在

  • 特性:程序加载时,操作系统会把 BSS 段全部清零

int global2; // 存放在 .bss 段(默认值为 0)
static int count2; // 存放在 .bss 段(默认值为 0)

5. 堆区(Heap,动态分配)

  • 存放内容:malloc、calloc、realloc分配的内存

  • 特点:

    • 手动分配和释放(malloc+free)

    • 从低地址向高地址增长(sbrk/mmap)

    • 空间较大,但分配速度比栈慢

    • 如果不释放,会造成内存泄漏

int *p = malloc(100 * sizeof(int)); // 在堆上分配 400 字节
// ... 使用 ...
free(p); // 手动释放

6. 栈区(Stack,函数调用)

  • 存放内容:局部变量、形参、函数返回值、函数调用信息(栈帧)

  • 特点:

    • 自动分配和释放(函数调用时压栈,返回时弹栈)

    • 从高地址向低地址增长(向下增长)

    • 空间有限(通常默认 8MB,超出会栈溢出)

    • 分配速度极快(移动栈指针即可)

void func(int a, int b) { // a 和 b 在栈上
int x = 10; // x 在栈上
char str[100]; // str 在栈上
} // 函数返回后,x、str、a、b 全部被自动回收

相关新闻

  • 深入解析C2000 ePWM高级功能:Trip-Zone、Event-Trigger与Digital Compare
  • Windows系统文件dmusic.dll丢失找不到问题解决
  • 网络基础科普

最新新闻

  • 收藏!小白程序员必看:AI大模型时代,哪些专业将迎来黄金机遇?
  • BuildBuddy终极指南:如何快速提升Bazel构建效率的10个技巧
  • 微软账户注册与安全配置全指南
  • 关于武汉智工职业技术学校,家长最常问的几个问题整理 - 升学择校早知道
  • NVIDIA Agent Toolkit 扩展全新 Omniverse 库,赋能 AI 智能体构建“仿真就绪”世界
  • 5分钟快速上手:跨平台社交媒体数据采集工具终极指南

日新闻

  • Python开发内部工具:7大核心库实战解析
  • 合肥雷达官方2026年7月最新信息:客户服务网点地址与售后热线权威公示 - 亨得利官方服务中心
  • PCA实战指南:从变量纠缠诊断到主成分业务解读

周新闻

  • SaaS软件行业GEO实践:AI搜索时代的品牌可见性与获客新路径
  • 什么是PCTFE?医药高端包装的“防潮王牌“材料
  • 【JVM调优实战】16-可视化利器-JConsole-VisualVM-JMC

月新闻

  • 2026年6月公司网站搭建最新热门渠道测评:四大低成本/零代码平台对比+避坑
  • 【Linux】Linux arm 编译QT程序,出现expected “}“报错
  • 【MATLAB例程】四基站二维AOA定位与距离辅助增强对比仿真。基于角度观测和测距修正的固定目标平面定位精度分析

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号