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