请看下面一个例子
#include <stdio.h>
int foo();
int bar();
int main()
{
printf("%d\n", foo(2, 3, 4));
return 0;
}
int foo(int a, int b)
{
return bar(a, b);
//return bar(a);
}
int bar(int c, int d)
{
int e = c + d;
return e;
}
因为老式风格的C函数声明可以不指定参数个数和类型,这样编译器不会对函数调用做检查。
此程序的运行实际是将前两个参数传入foo函数中,所以只计算2和3的和。
可以通过调试或者查看汇编代码可以发现:
1.在调用foo函数时得先准备好参数;
2.参数是从右向左依次压栈的;
由栈的特性(先进后出)知道读取参数值相当于从左向右,所以会将前两个参数传递进去。
如果将foo函数的return语句改为注释掉的那句,会发现程序运行结果不正常,在我的机器上运行结果为1245058
因为d是局部变量其初始值是一个随机数(我的机器上是1245056)所以结果会那样。