C语言函数是如何调用的呢?初学时我想当然地回答:从调用部分转到函数部分逐句执行,就是那么简单啊,然而你有没有想过····
函数调用前需要做哪些准备工作?函数是如何传参的?传参后又是如何使用的?参数使用完后又是如何销毁的?调用的整个过程是怎样的呢??
今天就通过下面这个简单的代码带大家走进函数的世界,一探究竟~
#include<stdio.h>
int Add(int x,int y)
{
int z=0;
z=x+y;
return z;
}
int main()
{
int a=10;
int b=20;
int ret=Add(a,b);
printf("ret=%d\n",ret)
}
上面这个加法函数的使用,想必大家一眼就能看懂,然而转到反汇编可以看到下面那么多的代码。。。有没有突然就懵逼了呢?_?想象中简单的调用为何变得如此复杂?这都是在搞什么嘞??(懵逼脸)
1.main函数开辟空间
每次函数调用都会开辟一块内存空间,该程序也不例外,接下来让我们先看一下具体是如何开辟空间的。下面这幅图是MAINCRTStartup调用main函数并初始化以及main函数栈帧的具体过程:
2.Add函数的调用
通过上面的步骤已经为main函数开辟好了空间,接下来进行Add函数的调用,具体流程如下图所示:
3.Add函数栈帧的销毁
下图是Add函数调用完成后,Add函数栈帧的销毁过程
到这里函数的栈帧具体过程就介绍完了,通过上面三幅图大家有没有对函数栈帧有一个清晰的认识呢?