首页/新闻资讯/正文详情

C程序的内存到底怎么分的?一文讲透内存分区

发布时间:2026/9/27 19:03:38 来源:云帆数科 栏目:资讯中心
C程序的内存到底怎么分的?一文讲透内存分区
1. 引言很多初学者在写 C 程序时常常会困惑变量到底存在哪里为什么局部变量和全局变量行为不一样为什么数组越界有时不报错、有时却段错误这些问题的答案都藏在 C 程序的内存分区里。本文用最直白的方式把 C 程序的内存布局讲清楚。2. 内存分区的整体图景一个 C 程序运行起来后操作系统会为它分配一块连续的虚拟地址空间。从高地址到低地址大致分为以下几个区域栈区Stack存放局部变量、函数参数、返回地址由编译器自动分配和释放。堆区Heap由程序员用malloc/free手动管理向高地址方向增长。全局区静态区存放全局变量和static修饰的变量程序启动时分配程序结束时释放。常量区只读区存放字符串字面量等只读数据修改会触发段错误。代码区Text存放编译后的机器指令只读。3. 栈区自动管理的临时仓库栈区是程序运行时最活跃的区域。每次调用一个函数系统就会在栈上压入一个「栈帧」用来存放这个函数的局部变量、参数和返回地址。函数返回时栈帧自动弹出内存随之释放。栈的特点是速度快、容量小、自动管理。默认栈大小通常在 1MB 到 8MB 之间取决于操作系统所以递归过深或定义过大的局部数组很容易导致栈溢出。#include stdio.h void func(int x) { int local x * 2; // local 存放在栈区 printf(%d\n, local); } int main() { func(10); // 调用函数时压栈返回时弹栈 return 0; }4. 堆区程序员自己管的大仓库堆区是程序员手动申请和释放的内存区域容量远大于栈受物理内存和虚拟内存限制。C 语言中通过malloc、calloc、realloc申请用free释放。堆的特点是容量大、速度慢、必须手动管理。忘记free会造成内存泄漏重复free或使用已释放的内存悬空指针则可能引发崩溃。#include stdio.h #include stdlib.h int main() { int *arr (int *)malloc(10 * sizeof(int)); // 在堆区申请 40 字节 if (arr NULL) { return 1; } arr[0] 100; printf(%d\n, arr[0]); free(arr); // 手动释放 return 0; }5. 全局区与静态区程序的一生全局变量和用static修饰的变量存放在全局区静态区。它们在程序启动时就被分配好直到程序结束才释放生命周期贯穿整个程序。这里要特别注意static修饰局部变量时变量的作用域仍然是函数内部但存储位置从栈区移到了全局区所以它的值在多次函数调用之间会保留。#include stdio.h int global_var 10; // 全局变量存放在全局区 void counter() { static int count 0; // 静态局部变量存放在全局区 count; printf(%d\n, count); } int main() { counter(); // 输出 1 counter(); // 输出 2 return 0; }6. 常量区与代码区只读的领地字符串字面量如hello存放在常量区这个区域是只读的。如果尝试修改它程序会直接崩溃段错误。代码区存放编译后的机器指令同样是只读的。#include stdio.h int main() { char *p hello; // hello 存放在常量区p 指向它 // p[0] H; // 错误常量区只读会段错误 printf(%s\n, p); return 0; }7. 一张表看懂内存分区区域存放内容分配方式生命周期容量栈区局部变量、函数参数编译器自动分配/释放函数调用期间小约 1-8MB堆区malloc 申请的内存程序员手动管理从申请到 free大受物理内存限制全局区全局变量、static 变量程序启动时分配整个程序运行期间中等常量区字符串字面量编译时确定整个程序运行期间只读代码区机器指令编译时确定整个程序运行期间只读8. 常见误区与实战建议理解了内存分区很多经典问题就迎刃而解函数返回局部数组的地址为什么危险因为局部数组在栈区函数返回后栈帧被释放地址变成悬空指针。为什么大数组要放在全局区或用 malloc因为栈区容量小大数组容易栈溢出。字符串常量为什么不能修改因为它在只读的常量区。内存泄漏怎么避免每次malloc都要配对free并养成检查返回值的习惯。建议初学者在写代码时时刻问自己一句这个变量存在哪个区它的生命周期有多长想清楚这两点C 语言的内存管理就成功了一大半。

相关推荐

建设英文品牌网站没人看?3步拆解流量与转化,教你怎么选对路径
建设英文品牌网站没人看?3步拆解流量与转化,教你怎么选对路径

建设英文品牌网站没人看?3步拆解流量与转化,教你怎么选对路径 做外贸的朋友最崩溃的是什么?不是代码写不出来,也不是服务器买不起,而是网站上线三个月,后台流量只有个位数,询盘邮箱空空如也。你看着那些精美的英文界面,心里直打鼓:这钱是不是白花了… · 2026/9/27 19:03:32

超越AlphaFold!Claude不靠人工指导,独立完成顶级生物学科研突破
超越AlphaFold!Claude不靠人工指导,独立完成顶级生物学科研突破

文章目录前言1. 先说人话:Claude 到底发现了啥1.1 为什么说它像 CRISPR2. 这活儿到底有多大2.1 一切的起点,是个 Prompt3. 这次跟 AlphaFold 那次不一样3.1 自主到什么程度4. 科学品味:AI 的新 KPI5. 评论区已经开始整活了5.1 发际线梯度下降… · 2026/9/27 19:03:26

MetaClaw-Bench完全教程:用30天多日交互数据集测量你的AI Agent学习能力与适应力
MetaClaw-Bench完全教程:用30天多日交互数据集测量你的AI Agent学习能力与适应力

MetaClaw-Bench完全教程:用30天多日交互数据集测量你的AI Agent学习能力与适应力 【免费下载链接】MetaClaw 🦞 Just talk to your agent — it learns and EVOLVES 🧬. 项目地址: https://gitcode.com/gh_mirrors/me/MetaClaw MetaCl… · 2026/9/27 19:03:26

3个排查法解决访问不了服务器网站吗最佳实践
3个排查法解决访问不了服务器网站吗最佳实践

3个排查法解决访问不了服务器网站吗最佳实践 网站突然打不开,后台却显示正常,这种“访问不了服务器网站吗”的报错最让人头大。更可怕的是,当你以为只是网络波动时,网站其实已被黑客植入木马,挂上了博彩广告或挖矿脚本。很多站长发现流量暴跌、被用户投… · 2026/9/27 19:40:15

长春绿园网站建设避坑指南 3个免费工具解决没人看难题
长春绿园网站建设避坑指南 3个免费工具解决没人看难题

长春绿园网站建设避坑指南 3个免费工具解决没人看难题 网站上线三个月,后台访问数据却纹丝不动,这是长春绿园区不少企业主的噩梦。很多人以为建好网站就万事大吉,其实 网站做好了没人访问… · 2026/9/27 19:40:09

2026最新wordpress上传svg报错全解:5个坑别踩
2026最新wordpress上传svg报错全解:5个坑别踩

2026最新wordpress上传svg报错全解:5个坑别踩 做网站运营和开发的朋友,是不是经常遇到这种“玄学”问题?代码看着没毛病,服务器配置也没动,结果一上传SVG图标,WordPress后台直接弹出一串英文报错,或者前端显示成一张破图… · 2026/9/27 19:40:09

彻底搞懂 MCP 协议:Agent 工具调用的统一标准,一文讲清原理、架构与落地
彻底搞懂 MCP 协议:Agent 工具调用的统一标准,一文讲清原理、架构与落地

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 19:39:57

问题的起点:为什么 Token 效率是硬指标——从上下文窗口到 Agent 成本,用 TaoToken 统一 Key 实测
问题的起点:为什么 Token 效率是硬指标——从上下文窗口到 Agent 成本,用 TaoToken 统一 Key 实测

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 19:39:51

RAG 检索落地避坑:从原理到工程化,打造企业级 AI 知识库的 TaoToken 配置实战
RAG 检索落地避坑:从原理到工程化,打造企业级 AI 知识库的 TaoToken 配置实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 19:39:45

MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现

简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01

汕头网站建设制作厂家避坑指南:5大注意事项救急
汕头网站建设制作厂家避坑指南:5大注意事项救急

汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01

多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习

简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01

MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现

简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01

汕头网站建设制作厂家避坑指南:5大注意事项救急
汕头网站建设制作厂家避坑指南:5大注意事项救急

汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01

多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习

简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码