您当前的位置:首页 > 计算机 > 编程开发 > C语言

C 语言的内存分区

时间:04-03来源:作者:点击数:

C/C++ 将内存划分为四个区

这里写图片描述

1、栈区(stacksegment)—自动分配区,由编译器来维护,申请的方式是栈指针减四(一条指令通常为四个字节),而释放的方式是将栈指针加四。

现假设过程P调用过程Q,并且假设P是主函数,则P的栈区保存:本身的局部变量、Q所用到的参数值、以及调用指令的后一条指令的地址(即返回地址)。而Q的栈区则保存调用Q之前的帧指针的值(地址,用来P的返回)、本身的局部变量、寄存器中的值(因为可能会覆盖P执行过程中某些寄存器的值,所以要先保存下来)、以及Q调用其他过程使用的参数。

为什么叫栈?因为函数的调用有“先调用的后返回、后调用先返回”的特点,因此内存空间也有“先申请的后释放,后释放的先申请”的特点,和数据结构栈一样,因此被称为栈内存。

2、堆区(heapsegment)—动态分配区,一般由程序员分配与释放,在C语言中使用 malloc/free 函数操作堆内存。堆区内存和数据结构堆没有一点关系。忘记释放会导致“内存泄漏“,消耗大量内存以至于操作系统可能崩溃,而过早释放则指针会随机指向别的地方,而那块内存可能保存了某些数据。

3、静态区(datasegment)—静态存储区,存放静态变量(全局变量以及静态局部变量)和常量,内存在程序编译时一次分配并初始化,程序执行完后释放。静态指的是值所占据的内存位置、大小不变,而不是值不变。

4、代码区(codesegment)—存放程序的二进制代码(机器码)。

方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门