内存分配空间中的堆区和栈区的区别

在C语言中,内存分配的空间一般分为六个区。常量代码区、数据段区、BSS段、堆空间、栈空间以及内存空间。内存空间是从下向上增长的。
(1)、常量区:用来存放代码和常量

(2)、数据段:用来存放初始化的静态变量和全局变量

(3)、bss段:用来存放未初始化的静态变量和全局变量

(4)、堆空间:动态malloc申请的空间,引用的变量实例化存储的空间

(5)、栈空间:用来存放局部变量,形参之类,未进行实例化的引用申请的变量

(6)、内核空间:用来存放内核代码和环境变量

而C语言中尤其是堆区和栈区的比较繁杂,经常容易混淆,笔者就是属于这种经常被绕的头晕的存在。

从上面可以看出堆区和栈区在内存分配管理中是靠着的,但是两者之间存在有缓存区进行隔开,其实堆区和栈区区别还是比较大的,主要在一下六个方面存在着差异:

(1)、管理方式不同:栈直接由编译器管理(产生和消除),堆由程序员管理,程序员管理其的产生和消除
(2)、空间大小不同:栈占用的空间较小,而堆占用的空间较大
(3)、能否产生碎片不同:栈不会产生碎片,但是堆会产生,会有内存泄露的问题
(4)、生长方向不同:栈是向下压栈,堆是向上存放数据
(5)、分配方式不同:栈是在程序员申请之后,由系统分配的没有经过初始化的变量,只有动态分配方式。而堆是由程序员自己实例化,创建的已经过初始化的变量,分配方式类似于链表,动态分配和静态分配都可以
(6)、分配效率不同:栈是由内存分配的,系统专门为其准备寄存器,同时有专门的出栈和入栈指令,因而效率比较高。而堆空间则是C库分配的,可能会存在碎片的原因导致内存不连续,因而效率比较低

重点在于分清平时多说的堆空间和栈空间,而我们平时所说的堆栈指的是栈空间。

作者:chris_YC
来源:CSDN
原文:https://blog.csdn.net/chris_leeYC/article/details/41778187
版权声明:本文为博主原创文章,转载请附上博文链接!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值