首页 > 编程语言 > 详细

C语言函数参数入栈的顺序为什么是从右到左

时间:2020-03-07 16:08:09      阅读:143      评论:0      收藏:0      [点我收藏+]

运行以下代码:

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://blog.csdn.net/weiyayunerfendou/article/details/72805766?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

https://blog.csdn.net/imJaron/article/details/78585051?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

C语言函数参数入栈的顺序为什么是从右到左

原文:https://www.cnblogs.com/FdWzy/p/12434432.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!