函数调用过程中栈到底是怎么压入和弹出的

 我来答
wdz521
2017-03-25 · TA获得超过233个赞
知道小有建树答主
回答量:251
采纳率:0%
帮助的人:159万
展开全部
这个可以用一个递归函数的过程来描述下
会比较形象
例如有递归函数
1.void example(int x)
2.{
3. if(x == 0)
4. return;
5. example(x-1);
6. printf(“%d\n”, x);
7. }
这段程序编译一下运行结果
比如调用example(5)
压栈过程是
5,4 , 3, 2, 1
输出,也就是弹栈过程是
1, 2, 3, 4, 5

步骤分解下
程序进入
1.example(5),走到程序第5行
发现又要进入example函数,可是
这时,example(5)还没执行结束
所以程序先把x=5存起来,这就是5入栈
他还要记录一下如果example(4)执行完后,
example(5)要继续从哪行执行,也就是第6行的输出语句,
所以行号也入栈,
*****这时候栈的状态是, x=5, 行号=6********
记录好栈后,再执行example(4)
接着来到example(4)内部,
发现又是example(4)没执行完,又要调用函数了,
这时候,他就又进行记录,我:example(4),要调用
函数了,但是我还没执行完,我先把我的变量状态和运行到
的位置记录下!先执行example(3),等我出来再收拾下面的
代码。
这时候,又开始记录了。
此时入栈 x=4,行号=6
*******这时候栈的状态*******
*******x=4,行号=6***********
*******x=5,行号=6***********
。。。。。。。。。。。。。。
之后会一直往下进行为
x=3 x=2 x=1 x= 0
当执行到example(0)的时候
栈的状态变成了
**************************
*****x=1,行号=6*********
*****x=2,行号=6*********
*****x=3,行号=6*********
*****x=4,行号=6*********
*****x=5,行号=6*********
***************************
注意!当x=0时,example(0)
程序走到第4行,发现函数example(0)执行完了
便退出函数,然后干啥呢?
他看了看栈,哎呦我去!,我栈里还排了这么一堆东西没处理
一个一个处理吧!
于是开始弹栈操作
第一步,把x=1,行号=6 弹出,此时变量x=1,执行程序第6行
打印出1,函数执行完毕
然后他一看栈里还有东西,再接着弹!
第二步,把x=2,行号=6 弹出,此时变量x=2,执行程序第6行
打印出2,函数执行完毕
然后他一看栈还没空管!,再接着弹!
弹弹弹弹弹弹。。。。
最后弹出x=5,行号=6,执行第六行,打印出6,退出函数
发现栈空了,好了,函数也退出了,栈也空了,执行完毕
最终打印结果1,2,3,4,5,6

不知道这么讲,题主能理解了么?
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式