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

运行以下代码:

void print(int x,int y,intz){

cout<

cout<

cout<

}intmain()

{

print(1,1,1);

getchar();

}

输出:

20200307160810324605.png

首先明确一个事实:在一个进程的内存图中,栈段位于上部,并且从高地址到低地址扩展,不会的可以看这里: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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值