当函数执行完毕后,如何返回调用处?
时间:08-14
来源:ZLG致远电子
点击:
T栈之前,首先看一种用于处理程序运行时的函数调用的系统栈。每当函数被调用时,系统首先创建一个称作活动记录或栈帧的结构,将其放在系统栈的栈顶。初始时,被调函数的活动记录只包含一个指向前一个活动记录的指针和一个返回地址。前一个活动记录的指针指向调用函数的活动记录,而返回地址包含的是函数调用结束后下一条执行语句的地址。因为在任何时刻只有一个函数被执行,所以被执行的函数就是活动记录位于系统栈栈顶的函数。
如果该函数又调用其它函数,那么函数中的局部变量(静态局部变量除外)及其参数也将加到其活动记录中,然后为被调函数创建一个新的活动记录并存放在系统栈栈顶的函数。当被调函数结束时,删除该活动记录。此时调用函数的活动记录又位于系统栈的栈顶,继续运行该函数。
C语言通过硬件栈保存函数的返回地址,被调用函数将返回地址出栈到程序计数器PC中,以返回到调用点,其示例代码详见程序清单2.29。
程序清单2.29 函数的调用与返回示例

对于程序清单2.29(10)来说,用C语言描述如下:

对于程序清单2.29(5)来说,用C语言描述如下:

由此可见,当调用函数时,将主程序代码行的下一条指令的地址保存到栈中;当函数返回时,程序就会从栈中获取该地址,并从那一点继续向下执行。在函数调用了其它函数的情况下,将每一个返回地址都放到栈中;当函数结束时,就可以找到它们在栈中的地址。
堆栈 相关文章:
- 教你识别背照式和堆栈式摄像头元件的区别(04-30)
