【C语言】栈区与堆区

栈区、堆区 是内存模型

对比起来看

分配管理方式

  • 栈区由编译器自动管理, 函数运行时分配,函数结束时释放。存放为运行函数而分配的局部变量(函数结束时,其内临时变量在栈区的空间会被后续操作覆盖)、函数参数、返回数据、返回地址等。其操作方式类似于数据结构中的栈。
  • 堆区是动态分配的,分配和释放由程序员通过内存管理基本函数(malloc, calloc, realloc, free)实现,若程序员不释放,程序结束时可能由操作系统回收。分配方式类似于链表。

 

申请大小限制不同

  • 栈向低地址扩展,是一块连续的内存区域,(有序的),栈顶的地址和栈的最大容量是系统预先规定好的,能从栈获得的空间较小
  • 堆向高地址扩展,是不连续的内存区域,(无序的),堆的大小受限于计算机系统的有效虚拟内存空间,可供使用的空间较大
    在这里插入图片描述

 

申请效率不同

  • 栈由系统自动分配,速度快,空间利用率高
  • 堆是有程序员自己分配,速度较慢,容易产生碎片,空间利用率较低

对堆来说,频繁执行malloc或free势必会造成内存空间的不连续,形成大量的碎片,使程序效率降低;而对栈而言,则不存在碎片问题。

 
 

总结:

(1)heap是堆,stack是栈;

(2)stack的空间由操作系统自动分配/释放,heap上的空间手动分配/释放;

(3)stack空间有限,heap是很大的自由内存区;

(4)C中的malloc函数分配的内存空间即在堆上,C++中对应的是new操作符。

  • 8
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值