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

在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
版权声明:本文为博主原创文章,转载请附上博文链接!

猜你喜欢

转载自blog.csdn.net/lqf_ok/article/details/88738776