【C语言】谈谈内存分配中的堆和栈的区别?为什么要有堆区和栈区呢?

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


通俗点讲,堆和栈的区别可以用如下的比喻来看出:

使用栈就象我们去饭馆里吃饭,只管点菜(发出申请)、付钱、和吃(使用),吃饱了就
走,不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作,他的好处是快捷,但是自 由度小。
使用堆就像是自己动手做喜欢吃的菜肴,比较麻烦,但是比较符合自己的口味,而且自由度大。


思考:
C:请描述一个可执行程序占用的内存分为哪几个区?每个分区各自的作用?
C:谈谈内存分配中的(.data)段和(.bss)段的区别?为什么要分.data段和.bss段?
C:谈谈内存分配中的堆和栈的区别?为什么要有堆区和栈区呢?


收录于:
嵌入式软件/BSP开发工程师/Linux驱动工程师/C语言经典笔试面试题大全

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Evan_ZGYF丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值