C语言中"栈"和"堆"怎么理解,C语言中的栈、堆是什么?

2021-01-13 09:08:38 字数 4922 阅读 9258

1楼:匿名用户

堆(heap)和栈(stack)有什么区别??

简单的可以理解为:

heap:是由malloc之类函数分配的空间所在地。地址是由低向高增长的。

stack:是自动分配变量,以及函数调用的时候所使用的一些空间。地址是由高向低减少的。

一个由c/c++编译的程序占用的内存分为以下几个部分

1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。

2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由os** 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。

c语言中的栈、堆是什么?

2楼:地面离家出走

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

栈就像装数据的桶或箱子

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

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

堆像一棵倒过来的树

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

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

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

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

3楼:夏天肥鱼

栈,可以看作是一摞卡片,最上面的卡片表示程序的当前作用域,这往往就是当前正在执行的函数。当前函数中声明的所有变量都置于栈顶帧中,即占用栈顶帧的内存,这就相当于一摞卡片中最上面的一张卡片。

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

堆和栈相比,没那么清晰的结构性。可以把堆可作是一“堆”小玩艺。程序可以在任何时间向这个“堆”增加新的东西,或者修改堆中已有的东西。

4楼:匿名用户

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

栈,可以看作是一摞卡片,最上面的卡片表示程序的当前作用域,这往往就是当前正在执行的函数。当前函数中声明的所有变量都置于栈顶帧中,即占用栈顶帧的内存,这就相当于一摞卡片中最上面的一张卡片。如果当前函数调用了另一个函数,举例来说,当前函数foo()调用了另一个函数bar(),就会在这摞卡片上再加一个新的卡片,这样bar()就有了自己的栈帧(stack frame)以供使用。

从foo()传递到bar()的所有参数都会从foo()栈帧复制到bar()栈帧中。(注:栈帧很有意义,因为栈帧可以为每个函数提供一个独立的内存工作区。

如果一个变量是在foo()栈帧中声明的,那么调用bar()函数不会对它带来改变,除非你专门要求修改这个变量。另外,foo()函数运行结束时,栈帧即消失,该函数中声明的所有变量都不会再占用内存了。)

堆,一段完全独立于当前函数或者栈帧的内存区。如果一个函数中声明了一些变量,而且希望当这个函数完成时其中声明的变量仍然存在,就可以将这些变量置于堆中。 堆和栈相比,没那么清晰的结构性。

可以把堆可作是一“堆”小玩艺。程序可以在任何时间向这个“堆”增加新的东西,或者修改堆中已有的东西。

5楼:匿名用户

堆栈是一种执行“后进先出”算法的数据结构。

设想有一个直径不大、一端开口一端封闭的竹筒。有若干个写有编号的小球,小球的直径比竹筒的直径略小。现在把不同编号的小球放到竹筒里面,可以发现一种规律:

先放进去的小球只能后拿出来,反之,后放进去的小球能够先拿出来。所以“先进后出”就是这种结构的特点。

堆栈就是这样一种数据结构。它是在内存中开辟一个存储区域,数据一个一个顺序地存入(也就是“压入——push”)这个区域之中。有一个地址指针总指向最后一个压入堆栈的数据所在的数据单元,存放这个地址指针的寄存器就叫做堆栈指示器。

开始放入数据的单元叫做“栈底”。数据一个一个地存入,这个过程叫做“压栈”。在压栈的过程中,每有一个数据压入堆栈,就放在和前一个单元相连的后面一个单元中,堆栈指示器中的地址自动加1。

读取这些数据时,按照堆栈指示器中的地址读取数据,堆栈指示器中的地址数自动减 1。这个过程叫做“弹出pop”。如此就实现了后进先出的原则。

堆栈是计算机中最常用的一种数据结构,比如函数的调用在计算机中是用堆栈实现的。

堆栈可以用数组存储,也可以用以后会介绍的链表存储。

下面是一个堆栈的结构体定义,包括一个栈顶指针,一个数据项数组。栈顶指针最开始指向-1,然后存入数据时,栈顶指针加1,取出数据后,栈顶指针减1。

#define max_size 100

typedef int data_type;

struct stack

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

栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区。里面的变量通常是局部变量、函数参数等。

堆,就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动**。

自由存储区,就是那些由malloc等分配的内存块,他和堆是十分相似的,不过它是用free来结束自己的生命的。

全局/静态存储区,全局变量和静态变量被分配到同一块内存中,在以前的c语言中,全局变量又分为初始化的和未初始化的,在c++里面没有这个区分了,他们共同占用同一块内存区。

常量存储区,这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改(当然,你要通过非正当手段也可以修改,而且方法很多.

6楼:圈圈叉叉叉叉圈

在c/c++中,内存分成5个区,他们分别是堆、栈、自由

存储区、全局/静态存储区和常量存储区。

如果你的这两个语句是出现在全局部分,那这个i就是被存储在全局/静态存储区;如果是出现在局部某个函数里,那i就被存储的栈里面。具体可以怎么理解?

栈里的东西自动分配内存空间,自动释放内存,而堆里面的东西只要是用到内存的都要手动分配,malloc函数在这个时候就起作用了。

栈:就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区。里面的变量通常是局部变量、函数参数等。

堆:就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动**。

自由存储区:就是那些由malloc等分配的内存块,他和堆是十分相似的,不过它是用free来结束自己的生命的。

c语言中,什么是栈,什么是堆

7楼:非常可爱

1、栈区(stack):由编译器自动分配释放,存放函数的参数值,局部变量等值。局部变量,任务线程函数之类的是放在(使用)栈里面的,栈利用率高一些。

其操作方式类似于数据结构中的栈。特别,栈是属于线程的,每一个线程会有一个自己的栈。

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

扩展资料

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

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

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

8楼:人间一枚惆怅客

栈是系统自动分配内存的,堆是程序员自己动态申请的内存比如,你int i;i就是存放在栈内存里面比如char *p=(char*)malloc(sizeof(char));p指向的内存就是存放在堆内存里面的

希望能帮到你

9楼:圈圈叉叉叉叉圈

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

如果你的这两个语句是出现在全局部分,那这个i就是被存储在全局/静态存储区;如果是出现在局部某个函数里,那i就被存储的栈里面。具体可以怎么理解?

栈里的东西自动分配内存空间,自动释放内存,而堆里面的东西只要是用到内存的都要手动分配,malloc函数在这个时候就起作用了。

栈:就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区。里面的变量通常是局部变量、函数参数等。

堆:就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动**。

自由存储区:就是那些由malloc等分配的内存块,他和堆是十分相似的,不过它是用free来结束自己的生命的。

10楼:杨尘一

栈(stack)又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。

向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。

堆,一段完全独立于当前函数或者栈帧的内存区。如果一个函数中声明了一些变量,而且希望当这个函数完成时其中声明的变量仍然存在,就可以将这些变量置于堆中。 堆和栈相比,没那么清晰的结构性。

可以把堆可作是一“堆”小玩艺。程序可以在任何时间向这个“堆”增加新的东西,或者修改堆中已有的东西。

C语言中的栈和堆是什么,C语言中的栈、堆是什么?

1楼 仙女小迷仔 1 计算机中的内存分为两部分 一部分是栈 stack,也称堆栈 ,另一部分是堆 heap 。 2 栈,可以看作是一摞卡片,最上面的卡片表示程序的当前作用域,这往往就是当前正在执行的函数。 3 堆,一段完全独立于当前函数或者栈帧的内存区。如果一个函数中声明了一些变量,而且希望当这个函...

C语言出栈是什么意思,C语言中的出栈是什么意思??

1楼 匿名用户 出栈是删除栈顶的元素,输出栈的值就是仅仅把它显示在屏幕上,并不删除它的值, 2楼 匿名用户 栈 是c中一个容器,先进先出, 出栈就是把数据取出来。输出栈的值就是把出栈的数据打印出来。看一下书就明白的。 3楼 匿名用户 出栈是说删除最顶上的元素。 c语言中的出栈是什么意思?? 4楼 匿...

汇编语言中什么是压栈出栈,汇编语言中的栈,压栈,出栈是什么意思

1楼 匿名用户 栈是一种线性数据结构,它遵循后进先出的顺序。有一个指针总指向栈顶。打个比方 一个栈就相当于一个桶,入栈就是向里面装东西,先装的在下面后装的在上面,装一个指针就会加1,指向新装的东西,出栈就相当于取出东西,只有先取上面的,再取下面的,当取一个后指针就会减一,即指针始终指向桶里最上面那个...