c语言中的堆和栈

1.电脑里的内存分为两部分:一部分是栈,一部分是堆。

2.Stack可以看作是一叠卡片。最上面的卡片代表程序的当前范围,通常是当前正在执行的函数。

3.堆,一个完全独立于当前函数或堆栈框架的内存区域。如果在一个函数中声明了一些变量,并且您希望在函数完成时在其中声明的变量仍然存在,那么您可以将它们放在堆中。

补充说明:

1.与栈相比,堆没有那么清晰的结构。您可以将堆视为一个“堆”小工具。程序可以随时向这个“堆”中添加新的东西,或者修改堆中已有的东西。

2.栈是实现LIFO算法的数据结构。想象一根直径很小的竹筒,一端开口,一端封闭。有几个编号的球,直径比竹筒略小。现在把不同号码的球放进竹筒里,我们可以发现一个规律:先放进去的球只能后拿出来,反之,后放进去的球可以先拿出来。

C语言中的栈和堆是什么? C语言中的堆和栈都是数据项按顺序排列的数据结构。

栈就像数据的桶或盒子。

先说大家熟悉的栈,栈是一种具有LIFO性质的数据结构,也就是说先取后存,先存后取。

就好像我们要把放在盒子底部的东西(之前放进去的物体)拿出来。我们必须先把压在上面的物体(后来放进去的物体)移走。

像倒挂的树一样堆积

堆不一样。Heap是一种排序的树形数据结构,每个节点都有一个值。

通常堆的数据结构是指二进制堆。堆的特点是根节点的值最小(或者最大),根节点的两个子树也是一个堆。

由于堆的这种特性,经常被用来实现优先级队列,堆的访问是任意的,就像从图书馆的书架上取书一样。

虽然书是按顺序排列的,但是我们想拿任何一本的时候,都不必把面前的书像一摞一样全部拿出来。书架的机制和盒子不一样,我们可以直接把想要的书拿出来。

扩展数据:

关于堆和栈的区别的比喻

用栈就像去饭店吃饭一样。我们只是点餐(申请),付钱吃饭(使用),吃饱了就走。切菜洗菜之类的准备工作,洗碗洗锅之类的收尾工作,我们都不用管。它的优点是速度快,但自由度小。

用heaps就像自己做自己喜欢的菜,比较麻烦,但是更符合自己的口味,自由度大。

参考来源:百度百科-栈

C语言中堆和栈的区别? (1)应用方法

堆栈:

由系统自动分配。比如在函数中声明一个局部变量int a;系统会自动在堆栈中为创建空间。

堆:

需要程序员自己申请,指定大小。c语言中的malloc函数。

如m1 =(char *)malloc(10);

在c #中使用new运算符

如m2 =(char *)malloc(10);

注意:m1和m2在堆栈中。

(2)应用后的系统响应

堆栈:只要堆栈的剩余空间大于请求的空间,系统就会为程序提供内存,否则会报告堆栈溢出的异常。

Heap:首先要知道操作系统有一个记录空闲内存地址的链表。当系统收到程序的申请时,会遍历链表,找到第一个空间大于申请空间的堆节点,然后从空闲节点链表中删除该节点,将该节点的空间分配给程序。另外,对于大多数系统来说,这种分配的大小会记录在这个内存空间的第一个地址,这样代码中的delete语句就可以正确地释放这个内存空间。此外,由于找到的堆节点的大小不一定完全等于应用程序的大小,系统会自动将多余部分放回空闲链表中。

(3)应用规模和增长方向的限制

堆栈:在Windows下,堆栈是扩展到低位地址和连续内存区域的数据结构。堆栈顶部的地址和堆栈的最大容量由系统预先指定。在WINDOWS下,堆栈的大小是2M(或1M,是在编译时确定的常数)。如果应用的空间超过堆栈的剩余空间,将会提示溢出。因此,可以从堆栈中获得更少的空间。

Heap: Heap是一种扩展到高位地址的数据结构,是一个不连续的内存区域。这是因为系统使用链表存储空闲内存地址,这种内存地址自然是不连续的,链表的遍历方向是从低位地址到高位地址。堆的大小受计算机系统中可用的虚拟内存的限制。可见堆获得的空间更灵活,更大。

(4)应用效率的比较:

堆栈由系统自动分配,速度更快。但是程序员无法控制它。

Heap是new分配的内存,一般比较慢,容易出现内存碎片,但是用起来最方便。

另外,在WINDOWS下,最好的办法是用VirtualAlloc分配内存,不在堆里,也不在栈里,直接在进程的地址空间里,虽然用起来最不方便。但它是快速且最灵活的。

(5)堆和栈中的存储内容

堆栈:当一个函数被调用时,首先要堆栈的是主函数中下一个指令的地址(函数调用语句的下一个可执行语句),然后是函数的参数。在大多数C编译器中,参数从右到左堆叠,然后是函数中的局部变量。请注意,静态变量是不堆叠的。

当这个函数调用完成后,首先弹出局部变量,然后是参数,最后堆栈的顶指针指向初始存储地址,也就是主函数中的下一条指令,程序从这里继续运行。

堆:通常,堆的大小存储在堆头的一个字节中。堆中的具体内容由程序员安排。

相关文章

发表新评论