C解析之三运行时内存分配
前言:以别样的角度解析C。
C语言的内存是让很多初学C编程的同学感到混乱与头疼的问题,受此困扰很难对C有清晰全面的把握,打击学习的积极性。然而,一般基础教材对C运行时内存往往避而不谈,高级参考资料的长篇大论同样让人抓不住要点。接下来,我就给各位同学解开C语言运行时内存的面纱。
内存空间与房间:
电脑的内存,通常有2G,4G等大小,这些空间由你的操作系统分配给你编写的C程序使用。当C程序运行时,便从操作系统得到一块内存空间,但这块空间怎么分配与管理,是我们要说的重点。类比个人的房间,毫无规则的摆放你的物品将会一团糟,显然我们需要有
某种规则
以便有条理的摆放与管理你的物品。对C语言而言,这个
某种规则
便是C语言
内存管理机制
。
1.分区
代码区 |
静态区 |
堆 |
空闲内存 |
栈 |
1.代码区:存放程序执行的代码
2.静态区:全局变量和静态变量(有的同学可能有更深的认识静态区可以 细分为:
1.非初始化数据段:存放未初始化的全局变量和静态变量。
2. 初始化的数据:
存放
初始化的全局变量和静态变量。
)
3.堆:动态分配区域,malloc, calloc, realloc等函数
4.空闲内存:堆栈式可延伸的,空闲内存提供堆向下与栈向上需要的空间
5.栈:局部变量及每次函数调用时返回地址、以及调用者的环境信息
C语言设计了这个规则,并严格的为每个程序分配与管理内存,使程序的运行井然有序。一个物品摆放整齐的房间,寻找某件物品会更快,C语言的内存分配机制同样如此,使其拥有更优良的性能。示例如下:
2.更多的思考
变量在内存分配的不同区域,有不同的特性。比如分配在静态区的数据,可以在编译时直接写入代码,以获得更高访问数据的速度。C在堆里分配的空间必须由程序员手动释放,否则会造成内存的泄露等更多进一步的了解。