当一个函数的运行期间调用另一个函数的时候,在运行被调用的函数之前,系统会怎样操作呢:
1. 将所有的实参,以及接下来会用到实参的语句的地址等信息传递给被调用的函数保存
2. 为被调用的函数的局部变量(还有被调函数里的变量)分配存储空间
3. 将控制转移到被调用函数的入口
而被调函数结束返回主调函数的之前,系统也是需要做以下的事情:
1. 上一步分配的储存空间全部free掉,但是要保存被调函数的返回结果
2. 依照开始保存的返回地址将控制转移给调用函数。
而在多次调用的时候,按照"后调用先返回"的原则。
也就是说,先把调用的函数拿过来,按照栈的形式进行存储然后再进行操作,例如下面代码:
#include<stdio.h>
void A();
void B();
void C();
void A()
{
B();
}
void B()
{
C();
}
void C()
{
printf("C");
}
int main(void)
{
A();
return 0;
}
这是一个压栈的过程!
在主函数调用A函数的时候,栈顶里存放的就是A函数里的数据,然后A函数又去调用B函数,B函数里的数据就被压进栈中,然后是C函数。当C函数执行完操作的时候,就释放掉其存储空间,然后是B,以此类推,当前运行的函数永远在栈顶。
网友评论