运行以下代码:
void print(int x,int y,intz){
cout<
cout<
cout<
}intmain()
{
print(1,1,1);
getchar();
}
输出:
首先明确一个事实:在一个进程的内存图中,栈段位于上部,并且从高地址到低地址扩展,不会的可以看这里:https://www.cnblogs.com/FdWzy/p/12424308.html
从图中我们发现x,y,z的地址逐渐变大,表明:函数参数入栈顺序是从右到左的。(自己画一下图很好理解)
原因:由于c语言有不定长参数函数,比如下面这个:
int add(intnum,...) {
va_list valist;//用于放参数
int sum = 0;inti;/*以num个参数初始化valist*/va_start(valist, num);/*把参数放进valist*/
for (i = 0; i < num; i++)
{
sum+= va_arg(valist, int);
}/*清理内存*/va_end(valist);returnsum;
}intmain()
{
cout<
getchar();
}
其运行原理是:num指示参数个数,然后函数体内部的valist是一个void*指针,每次移sizeof(int)大小,即每次取1个int参数。但我也没有研究过这个方面,大概知道有这么个东西就行
总之我想说的是,如果函数调用是从左到右入栈参数,像上面的函数参数形成的栈就是这样的:num,1,2,3。
其中num在栈底,3在栈顶。但是由于这是个不定参数函数,需要这个num的值去确定我们参数的个数,但num在栈底我们抽不出来阿,问题就在这儿。
如果从右到左入栈的话就不存在这个问题了。
参考:
原文:https://www.cnblogs.com/FdWzy/p/12434432.html