先看一个简单的代码:
#include<stdio.h>
#include<stdlib.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 = 0;
ret = Add(a, b);
printf("%d\n", ret);
system("pause");
return 0;
}
每次的函数调用都是一个过程,这个过程我们通常称之为:函数调用
这个过程要为函数开辟栈空间,用于本次函数的调用中临时变量的保存、现场保护。这块栈空间我们称之为:函数栈帧
在学习栈帧时我们必须首先了解两个寄存器ebp和esp,在函数调用过程中这两个寄存器存放了维护这个栈的栈底和栈顶指针;
比如在调用main函数,我们为main函数分配栈帧空间,那么栈帧维护如下:
要详细研究函数的调用,就必须得用汇编代码:
1:任何函数都是从main函数的地方开始,要调用main函数(main函数是在mainCRTstart()中被调用),就要为main函数创建栈帧,首先先观察main函数栈帧的创建:
2:Add函数执行
3:函数返回
寄存器eax带回30后赋给ret,输出ret=30后释放为main函数开辟的堆栈。
以上就是整个函数调用的过程。
特别注意的是:
形参是实参的一份临时拷贝,改变形参的值并不会改变实参,如果想改变实参的值,函数的参数就应该传地址,通过对地址解引用可以改变实参。