c语言中堆和栈的区别,c语言堆和栈的概念和区别

c语言中堆和栈的区别
c语言中堆和栈的区别分为:空间分配区别、缓存方式区别、数据结构区别 。
堆和栈空间分配区别:
栈(操作系统):由操作系统自动分配释放 , 存放函数的参数值,局部变量的值等 。其操作方式类似于数据结构中的栈 。
堆(操作系统):一般由程序员分配释放,若程序员不释放 , 程序结束时可能由OS回收,分配方式倒是类似于链表 。
堆栈缓存方式区别:
栈使用的是一级缓存,他们通常都是被调用时处于存储空间中,调用完毕立即释放 。
堆是存放在二级缓存中,生命周期由虚拟机的垃圾回收算法来决定(并不是一旦成为孤儿对象就能被回收) 。所以调用这些对象的速度要相对来得低一些 。
堆栈数据结构区别:
堆(数据结构):堆可以被看成是一棵树,如:堆排序 。
栈(数据结构):一种先进后出的数据结构 。
c语言堆和栈的概念和区别内存分配中的堆和栈
在 C 语言中,内存分配方式不外乎有如下三种形式:
从静态存储区域分配:它是由编译器自动分配和释放的,即内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在,直到整个程序运行结束时才被释放,如全局变量与 static 变量 。
在栈上分配:它同样也是由编译器自动分配和释放的,即在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元将被自动释放 。需要注意的是,栈内存分配运算内置于处理器的指令集中,它的运行效率一般很高 , 但是分配的内存容量有限 。
从堆上分配:也被称为动态内存分配,它是由程序员手动完成申请和释放的 。即程序在运行的时候由程序员使用内存分配函数(如 malloc 函数)来申请任意多少的内存,使用完之后再由程序员自己负责使用内存释放函数(如 free 函数)来释放内存 。也就是说,动态内存的整个生存期是由程序员自己决定的,使用非常灵活 。需要注意的是,如果在堆上分配了内存空间,就必须及时释放它,否则将会导致运行的程序出现内存泄漏等错误 。
数据结构的堆和栈
在数据结构中,栈是一种可以实现“先进后出”(或者称为“后进先出”)的存储结构 。假设给定栈 S=(a0,a1 , …,an-1) , 则称 a0 为栈底,an-1 为栈顶 。进栈则按照 a0,a1,… , an-1 的顺序进行进栈;而出栈的顺序则需要反过来,按照“后存放的先取,先存放的后取”的原则进行,则 an-1 先退出栈,然后 an-2 才能够退出 , 最后再退出 a0 。
在实际编程中,可以通过两种方式来实现:使用数组的形式来实现栈,这种栈也称为静态栈;使用链表的形式来实现栈,这种栈也称为动态栈 。
相对于栈的“先进后出”特性,堆则是一种经过排序的树形数据结构,常用来实现优先队列等 。假设有一个集合 K={k0,k1 , …,kn-1},把它的所有元素按完全二叉树的顺序存放在一个数组中,并且满足:

c语言中堆和栈的区别,c语言堆和栈的概念和区别

文章插图
则称这个集合 K 为最小堆(或者最大堆) 。
由此可见,堆是一种特殊的完全二叉树 。其中 , 节点是从左到右填满的,并且最后一层的树叶都在最左边(即如果一个节点没有左儿子 , 那么它一定没有右儿子);每个节点的值都小于(或者都大于)其子节点的值 。
c语言里%是什么意思放在堆里的数据是管理员自己开辟空间和释放空间,如,new 和malloc 。
而放在栈里的数据时计算机自动分配内存和释放的 , 如变量 。
在c/c++中 , 内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区 。
1,栈:就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区 。里面的变量通常是局部变量、函数参数等 。
2,堆:就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete 。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收 。
3,自由存储区:就是那些由malloc等分配的内存块,他和堆是十分相似的,不过它是用free来结束自己的生命的 。
4,全局存储区(静态存储区):全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域 。程序结束后有系统释放 。


推荐阅读