C 语言的内存分区

C/C++ 将内存划分为四个区
这里写图片描述

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

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

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

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

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

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值