C语言中函数参数压入栈的顺序

C语言的函数参数传递遵循不同的调用惯例,如cdecl、stdcall、fastcall和pascal等。cdecl是默认惯例,参数从右向左压栈,出栈由调用方负责。pascal惯例则相反,参数从左向右压栈,函数自身负责出栈。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 调用惯例

C调用惯例规定的方面之一是函数参数的传递顺序和方式,函数参数压入栈的顺序是从右向左还是从左向右,传递方式是使用栈还是使用寄存器以提高性能,还是两者都使用,等。


在C语言里,存在这多个调用惯例,如cdecl,stdcall,fastcall,pascal等。

其中cdecl是C语言默认的调用惯例,其调用惯例规定的出栈方为函数调用方,参数压入栈的顺序为从右向左,名字修饰为下划线+函数名。

pascal调用惯例规定的出栈方为函数本身,参数压入栈的顺序为从左向右,名字修饰符,呵呵,太复杂了。


2. 例子,如下代码:

/* CallingConvention.c*/
#include <stdio.h>

int sum(unsigned count, ...);
int main(void)
{
    int result = sum(4, 1, 3 ,5 ,7);                                                                                         
    printf("1 + 3 + 5 + 7 = %d\n", result);
    return 0;
}

int sum(unsigned count, ...)
{
    int ret = 0;
    int *p = &count + 1;   //此时p指向最后一个参数
        
    while (count--)
        ret += *p++;       //每次p++使得p指向上一个参数
    return ret;
}

结果:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值