栈帧是什么

Python019

栈帧是什么,第1张

栈帧也叫过程活动记录,是编译器用来实现过程或函数调用的一种数据结构。C语言中,每个栈帧对应着一个未运行完的函数。栈帧中保存了该函数的返回地址和局部变量。栈帧,顾名思义,就是栈中的一帧,栈分成很多帧,就如同一个视频动作分成好多帧一样。每个栈帧,对应一个函数,就是这个函数在栈中占用的部分。

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

栈就像装数据的桶或箱子

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

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

堆像一棵倒过来的树

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

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

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

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

扩展资料:

关于堆和栈区别的比喻

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

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

参考资料来源:百度百科-堆栈

你的老师是没说错的。栈的规则是先进后出,后进先出。进入栈不代表会运行,它只是进入了1个运行的队列。按照你的方法那这个栈基本没意义了,因为你是进栈就出栈了,直接就运行了。并没有一个队列顺序。

1、printf(n2)它最先进栈,所以它的排在队列的最后面,它最后运行。这符合程序的运行顺序

2、printf(n1)它第二进栈,所以它是倒数第二个运行的。以此类推下去。

3、如果按照你的说法,main最先进栈,你会发现它是在栈的底部,它无法最先运行。因为它上面还有你说的printf1,2,3,4,5等等。先出栈也是它们,意味着先运行也是它们。这和事实不符的。因为运行一个程序是从主函数开始运行的。

4、根据栈的规定,这里main应该是最后进栈的才对,因为它最后进栈,所以他最先出栈,也是它最先运行。