当前位置:首页 » 编程语言 » c语言的堆

c语言的堆

发布时间: 2023-07-09 15:12:36

1. c语言中内存堆和栈的区别

堆(heap)和栈(stack)原本是两种不同的数据结构,在C语言内存表述中,代表着用这两种数据结构管理的两种内存块。
堆由整个系统共享,各个进程拥有同一个堆。 栈由每个进程自行管理,也就是每个进程的栈是独立的,互不相关。
具体区别如下:
一、栈上的内存由系统自动管理分配,用于存储局部变量。 堆中的内存由编程人员主动申请,在C语言中申请内存的函数为malloc, 使用后需要编程人员自行调用free函数释放。
二、从分配释放及访问速度上,栈内存的存取,申请释放速度要高于堆内存。
三、栈内存相对于堆内存要小的多,所以在编程的时候,一般不建议使用占空间过大的局部变量。
四、堆中所有数据均由编程人员申请使用。 栈中除了存放函数中可见的局部变量外,还有各种系统环境数据。

2. C语言中,什么是栈,什么是堆

1、栈区(stack):由编译器自动分配释放,存放函数的参数值,局部变量等值。局部变量,任务线程函数之类的是放在(使用)栈里面的,栈利用率高一些。其操作方式类似于数据结构中的栈。特别,栈是属于线程的,每一个线程会有一个自己的栈。

2、堆区(heap):一般由程序员分配释放,若程序员不释放,则可能会引起内存泄漏。注意它和数据结构中的堆是两回事,分配方式倒是类似于链表,常见的就是malloc出来的都是属于堆区,就像固定出来的区域,到free的时候才释放,有点类似全局的,静态的。

(2)c语言的堆扩展阅读

栈内存是由编译器自动分配与释放的,它有两种分配方式:静态分配和动态分配。

1、静态分配是由编译器自动完成的,如局部变量的分配(即在一个函数中声明一个int类型的变量i时,编译器就会自动开辟一块内存以存放变量i)。

2、动态分配由alloca函数进行分配,但是栈的动态分配与堆是不同的,它的动态分配是由编译器进行释放,无需任何手工实现。

3. C语言中的堆条件是什么

排序。

在数据结构中,栈是一种可以实现“先进后出”(或者称为“后进先出”)的存储结构。假设给定栈 S=(a0,a1,…,an-1),则称 a0为栈底,an-1为栈顶。

进栈则按照 a0,a1,…,an-1的顺序进行进栈;而出栈的顺序则需要反过来,按照“后存放的先取,先存放的后取”的原则进行,则 an-1先退出栈,然后 an-2才能够退出,最后再退出 a0。

在实际编程中,可以通过两种方式来实现:使用数组的形式来实现栈,这种栈也称为静态栈;使用链表的形式来实现栈,这种栈也称为动态栈。

相对于栈的“先进后出”特性,堆则是一种经过排序的树形数据结构,常用来实现优先队列等。假设有一个集合 K={k0,k1,…,kn-1},把它的所有元素按完全二叉树的顺序存放在一个数组中,并且满足:



则称这个集合 K 为最小堆(或者最大堆)。

由此可见,堆是一种特殊的完全二叉树。其中,节点是从左到右填满的,并且最后一层的树叶都在最左边(即如果一个节点没有左儿子,那么它一定没有右儿子);每个节点的值都小于(或者都大于)其子节点的值。

4. C语言中有无堆的概念

栈,堆,静态区,是内存开辟的三个专属区,C语言的内存分配也就只有这三种方式

1.内存在栈上创建(栈结构)
如函数里定义的变量int i; char str[80],还有保存函数的所有信息的内存都是在栈上创建的
这块内存是连续的,就好比是一个数组,所以你在内存分配的时候,会发现变量地址是连续的

2.内存在堆上创建(链表结构)
这块内存是有很多内存块组成,很像鞭炮一样串在一根绳子上,但这些内存块的大小不一样,存储在链表结构中的结点中,当你用malloc动态申请是,编译器会根据你内存块的大小从表头一次检索,直到链表中的内存块大于等于你所申请的内存大小时,返回该快内存,如果链表上的内存块大于你所申请的内存时,会将多余内存回收到链表结构,这也就是为什么动态申请内存容易造成内存碎片的产生原因。所以分配内存时你会发现他们的地址不连续

3内存在静态区创建
如全局变量,static变量
这块内存也是连续的,也像一个数组,但它跟栈上创建内存唯一的区别是,内存作用时间不一样,静区内存作用时间是整个“程序”运行时间,栈上内存作用时间是整个“函数”的运行时间,注意“程序”和“函数”的区别

而堆内存作用时间范围是0到整个“程序”运行时间,如果你要在小于整个“程序”运行时间内释放这块内存的话,就要使用free,所以是手动申请手动释放,你自己可以控制,但是写代码的好习惯习惯是程序中有几个malloc就有几个free,这样可以防止内存泄露

代码段指的是代码段寄存器,你写的代码存放在这个寄存器里,等待CPU调用,这个属于微机原理所讨论问题,有兴趣可以学学

5. C语言中的栈和堆是什么

1、计算机中的内存分为两部分:一部分是栈(stack,也称堆栈),另一部分是堆(heap)。

2、 栈,可以看作是一摞卡片,最上面的卡片表示程序的当前作用域,这往往就是当前正在执行的函数。

3、堆,一段完全独立于当前函数或者栈帧的内存区。如果一个函数中声明了一些变量,而且希望当这个函数完成时其中声明的变量仍然存在,就可以将这些变量置于堆中。

6. C语言中的栈、堆是什么

C语言中的堆和栈都是一种数据项按序排列的数据结构。

栈就像装数据的桶或箱子

我们先从大家比较熟悉的栈说起吧,它是一种具有后进先出性质的数据结构,也就是说后存放的先取,先存放的后取。

这就如同我们要取出放在箱子里面底下的东西(放入的比较早的物体),我们首先要移开压在它上面的物体(放入的比较晚的物体)。

堆像一棵倒过来的树

而堆就不同了,堆是一种经过排序的树形数据结构,每个结点都有一个值。

通常我们所说的堆的数据结构,是指二叉堆。堆的特点是根结点的值最小(或最大),且根结点的两个子树也是一个堆。

由于堆的这个特性,常用来实现优先队列,堆的存取是随意,这就如同我们在图书馆的书架上取书。

虽然书的摆放是有顺序的,但是我们想取任意一本时不必像栈一样,先取出前面所有的书,书架这种机制不同于箱子,我们可以直接取出我们想要的书。

(6)c语言的堆扩展阅读:

关于堆和栈区别的比喻

使用栈就象我们去饭馆里吃饭,只管点菜(发出申请)、付钱、和吃(使用),吃饱了就走,不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作,他的好处是快捷,但是自由度小。

使用堆就象是自己动手做喜欢吃的菜肴,比较麻烦,但是比较符合自己的口味,而且自由度大。

参考资料来源:网络-堆栈



7. C语言中堆和栈的区别

数据结构里堆和栈,原理差不多都是先进后出,但是堆一般是一个二叉树,是非线性,比如堆排序。栈往往是线性。
C语言里堆和栈是操作系统对内存管理实现的两个不同部分。
栈空间是操作系统自己管理,分配,释放也是操作系统做。普通局部变量都存在栈里。
堆区的空间是用户自己分配管理,比如每一次malloc必须自己free。要不然操作系统不会帮你释放。
C语言还有一个代码段,这个区域程序执行后不可写,一般用来存储常量。

8. C语言中堆和栈的区别

(1)申请方式
stack:
由系统自动分配。例如,声明在函数中一个局部变量 int a; 系统自动在栈中为a开辟空间
heap:
需要程序员自己申请,并指明大小,在c中malloc函数
如m1 = (char *)malloc(10);
在C++中用new运算符
如m2 = (char *)malloc(10);
注意:m1、m2本身是在栈中的。

(2)申请后系统的响应
栈:只要栈的剩余空间大于所申请空间,系统将为程序提供内存,否则将报异常提示栈溢出。
堆: 首先应该知道操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时,会遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲 结点链表中删除,并将该结点的空间分配给程序,另外,对于大多数系统,会在这块内存空间中的首地址处记录本次分配的大小,这样,代码中的delete语句才能正确的释放本内存空间。另外,由于找到的堆结点的大小不一定正好等于申请的大小,系统会自动的将多余的那部分重新放入空闲链表中。
(3)申请大小的限制及生长方向
栈:在Windows下,栈是向低地址扩展的数据结构,是一块连续的内存的区域。这句话的意思是栈顶的地址和栈的最大容量是系统预先规定好的,在WINDOWS下,栈的大小是2M(也可能是1M,它是一个编译时就确定的常数),如果申请的空间超过栈的剩余空间时,将提示overflow。因此,能从栈获得的空间较小 。
堆:堆是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。由此可见,堆获得的空间比较灵活,也比较大。
(4)申请效率的比较:
栈由系统自动分配,速度较快。但程序员是无法控制的。
堆是由new分配的内存,一般速度比较慢,而且容易产生内存碎片,不过用起来最方便.
另外,在WINDOWS下,最好的方式是用VirtualAlloc分配内存,他不是在堆,也不是在栈是直接在进程的地址空间中保留一快内存,虽然用起来最不方便。但是速度快,也最灵活。
(5)堆和栈中的存储内容
栈:在函数调用时,第一个进栈的是主函数中后的下一条指令(函数调用语句的下一条可执行语句)的地址,然后是函数的各个参数,在大多数的C编译器中,参数是由右往左入栈的,然后是函数中的局部变量。注意静态变量是不入栈的。
当本次函数调用结束后,局部变量先出栈,然后是参数,最后栈顶指针指向最开始存的地址,也就是主函数中的下一条指令,程序由该点继续运行。
堆:一般是在堆的头部用一个字节存放堆的大小。堆中的具体内容有程序员安排。

9. C语言里,哪些变量是存放在堆里哪些是存放在栈里

在c/c++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。

栈:就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区。里面的变量通常是局部变量、函数参数等。
堆:就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。
自由存储区:就是那些由malloc等分配的内存块,他和堆是十分相似的,不过它是用free来结束自己的生命的。
全局存储区(静态存储区):全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后有系统释放。
常量存储区:这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改。
希望对你有帮助

热点内容
浙江电脑服务器租用虚拟主机 发布:2025-02-09 00:29:48 浏览:76
安卓网在哪里 发布:2025-02-09 00:29:36 浏览:391
汇编语言调用c语言 发布:2025-02-09 00:19:25 浏览:335
网络编程http 发布:2025-02-09 00:18:33 浏览:62
php的点餐系统 发布:2025-02-09 00:17:03 浏览:600
安卓区转苹果区会发生什么 发布:2025-02-09 00:16:26 浏览:131
c语言编译完怎么执行 发布:2025-02-09 00:16:16 浏览:27
AMD平台对应的C编译器 发布:2025-02-09 00:15:35 浏览:68
行李箱的密码锁哪里修 发布:2025-02-08 23:58:14 浏览:531
c语言字母ascii码表 发布:2025-02-08 23:55:49 浏览:838