C中为什么参数以列表反序压入堆栈中

转自:《C和指针》中文版,p396


我们现在可以推断出为什么参数要按照列表反序压入到堆栈中。被调用函数使用帧指针加一个偏移量来访问参数。当参数以反序压入到堆栈时,参数列表的第一个参数便位于堆栈中这堆参数的顶部,它距离帧指针的偏移量是一个常数。事实上,任何一个参数距离帧指针的偏移量都是一个常熟,这和堆栈中压入多少个参数并无关系。


如果参数以相反的顺序压入到堆栈会怎样呢(即按照参数列表顺序)?这样一来,第一个参数距离帧指针的偏移量就和压入到堆栈中的参数数量有关。编译器可以计算出这个值,但还是存在一个问题 -- 实际传递的参数数量和函数期望接受的参数数量可能并不相同。在这种情况下,这个偏移量是不正确的


那么祝反序方案中,额外当参数时如何处理当呢?堆栈帧当图显示任何额外当参数都将位于前几个参数当下马,第一个参数距离帧指针的距离将保持不变。因此,函数可以正确地访问前三个参数,对于额外的参数可以简单地忽略。


附:

为什么C中实际传递的参数数量和函数期望接受的参数数量可以不相同:

因为C的方法签名中并不包含参数,即int foo(int a)和int foo(int a, int b)不能同时出现,这点和C++不一样的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值