考察下面C程序: main() int x,y; P1(…) { … P2(…); … } P2(…) { … P3(…); … } P3(…) { … } { … P1(…); … } 试说明,该程序执行时,运行栈中调用记录的变化情况。
时间: 2023-11-28 17:49:21 浏览: 71
当程序执行到`main()`函数时,会在运行栈中为`x`和`y`分配内存空间。
然后,`main()`函数调用`P1()`函数,会将`main()`函数的返回地址和局部变量`x`和`y`的值保存在运行栈中。运行栈中现在的情况如下:
```
_________
| |
| |
| |
| |
| ... |
|_________|
| | <- P1()函数的返回地址
| |
| |
| |
| y |
|_________|
| |
| |
| |
| x |
|_________|
| |
| |
| ... |
|_________|
| | <- main()函数的返回地址
|_________|
```
接下来,`P1()`函数调用`P2()`函数,同样会将`P1()`函数的返回地址保存在运行栈中。运行栈中现在的情况如下:
```
_________
| |
| |
| |
| |
| ... |
|_________|
| | <- P2()函数的返回地址
|_________|
| | <- P1()函数的返回地址
| |
| |
| y |
|_________|
| |
| |
| |
| x |
|_________|
| |
| |
| ... |
|_________|
| | <- main()函数的返回地址
|_________|
```
`P2()`函数调用`P3()`函数,同样会将`P2()`函数的返回地址保存在运行栈中。运行栈中现在的情况如下:
```
_________
| |
| |
| |
| |
| ... |
|_________|
| | <- P3()函数的返回地址
|_________|
| | <- P2()函数的返回地址
| |
| |
| y |
|_________|
| |
| |
| |
| x |
|_________|
| |
| |
| ... |
|_________|
| | <- P1()函数的返回地址
| |
|_________|
| | <- main()函数的返回地址
|_________|
```
`P3()`函数没有调用其他函数,因此运行栈中不会有变化。
最后,`P3()`函数执行完毕,会将`P2()`函数的返回地址弹出运行栈。运行栈中现在的情况如下:
```
_________
| |
| |
| |
| |
| ... |
|_________|
| | <- P2()函数的返回地址
|_________|
| | <- P1()函数的返回地址
| |
| |
| y |
|_________|
| |
| |
| |
| x |
|_________|
| |
| |
| ... |
|_________|
| | <- main()函数的返回地址
|_________|
```
`P2()`函数执行完毕,会将`P1()`函数的返回地址弹出运行栈。运行栈中现在的情况如下:
```
_________
| |
| |
| |
| |
| ... |
|_________|
| | <- P1()函数的返回地址
| |
| |
| y |
|_________|
| |
| |
| |
| x |
|_________|
| |
| |
| ... |
|_________|
| | <- main()函数的返回地址
|_________|
```
`P1()`函数执行完毕,会将`main()`函数的返回地址弹出运行栈。运行栈中现在的情况如下:
```
_________
| |
| |
| |
| |
| ... |
|_________|
| | <- main()函数的返回地址
| |
| |
| y |
|_________|
| |
| |
| |
| x |
|_________|
| |
| |
| ... |
|_________|
```
最后,`main()`函数执行完毕,程序结束。