写C程序时,变量存哪?函数放哪?为什么有时候数组越界会“崩程序”?其实,C程序的内存就像一套“分区的房子”,每个区块有固定用途。搞懂这5个内存分区,写代码更稳,调试更轻松!

一、代码区(Text Segment)
作用:存储编译后的机器指令(即程序的二进制代码)。
特点:
只读,程序运行时不能修改;
所有线程共享同一份代码。
白话理解:就像“说明书”,只能看不能改,所有“工人”(线程)按它干活。
二、全局/静态存储区(Data Segment)
细分:
初始化区:存放已初始化的全局变量、静态变量(如 int a = 10;);
未初始化区(BSS段):存放未初始化的全局变量、静态变量(如 int b;,默认值为0)。
特点:
程序启动时分配,程序结束时释放;
生命周期贯穿整个程序运行期。
白话理解:像“长期仓库”,程序一启动就开门,结束才关门,东西放进去不会丢。
三、栈区(Stack Segment)
作用:存储函数调用时的局部变量、函数参数、返回地址等。
特点:
由编译器自动分配和释放(函数调用时压栈,返回时弹栈);
空间有限(默认几MB,超限会“栈溢出”崩溃);
先进后出(LIFO)结构。
白话理解:像“抽屉”,函数一调用就打开,放临时用的东西,函数结束自动关上,放太多会撑爆。
四、堆区(Heap Segment)
作用:通过 malloc、calloc、realloc 动态分配内存,需手动 free 释放。
特点:
空间大(受系统内存限制);
分配/释放由程序员控制,易忘记释放导致内存泄漏;
分配速度比栈慢(需搜索空闲块)。
白话理解:像“自由市场”,要多大空间自己申请,用完了得自己收拾,不然会变“垃圾场”。
五、内存映射区(Memory Mapping Segment)
作用:映射磁盘文件到内存(如加载动态库 .so/.dll,或用 mmap 映射文件)。
特点:
文件内容直接读入内存,修改后写回磁盘;
程序结束时由系统自动释放。
白话理解:像“投影仪”,把文件内容投到内存里,改内存就等于改文件。
总结:内存布局“五步记”
代码区:只读指令,所有线程共用;
全局/静态区:长期存储,程序启动就分配;
栈区:函数临时变量,自动分配释放;
堆区:动态申请内存,需手动管理;
内存映射区:文件临时加载,程序结束释放。
本文凡亿教育原创文章,转载请注明来源!
暂无评论