背景
一般来说,我们调用一个函数的时候,需要传入对应数据类型和个数的参数,例如调用int sum(int x,int y);我们需要传入两个int类型的数,且只能传入两个int类型的数。如果类型不匹配或者个数不匹配,编译器都会报warning或者error。我们将int x ,int y称作形参,下面就来分析以下参数是怎么传递给被调用函数的。
备注:
测试的平台x86_64-redhat-linux
固定参数
固定参数指的是,一个函数的形参个数是确定的,如上面举例的int sum(int x,int y); 它的参数个数是2,是一个固定值。还有一种参数个数是可变的,例如printf函数,对于可变参数入参在下一节中分析。
大部分的课本或者图书上说,函数入参的顺序是从右往左依次压入栈中,由于栈的增长是由高地址向低地址增长,故可以得知越是靠近右边的参数,所处的地址应该是越大的。例如my_printf(char* fmt,int a,int b,int c),入栈的顺序:c->b->a->fmt(指针),地址的大小也是c->b->a->fmt(指针)。
我写了一个测试程序来验证这个说法,这个测试程序把函数的入参地址打印出来了:
void my_printf(char* fmt,int a,int b,int c)
{
printf("addr: fmt:%p a:%p b:%p c:%p\n",&fmt,&a,&b,&c);
}
int main()
{
my_printf("%d&