c语言可变长参数的秘密

      今天我们来探究一下c语言之可变长参数的秘密。我相信看了这篇文章后,c语言的可变长参数就不再有什么秘密。

一、函数参数的入栈

1.1 函数的参数如何传递


        在c语言的函数调用中,有些函数需要参数的传入。编译器是如何实现的呢?首先在函数的调用时,会为即将调用的函数准备一个栈,然后将输入参数按照实参的顺序从右到左依次压入栈中了。

例如:
void func(arg0, arg1, arg2, arg3, arg3, arg4)

程序会依次将arg4, arg3, arg2, arg1, arg0压入栈中,程序运行栈如下:
---------栈底------
    [arg4]
    [arg3]
    [arg2]
    [arg1]
    [arg0]
---------栈顶------

1.2 特殊符号 ...

        编译器在c源码的编译中遇到了 ... 这种特殊符号时,编译器会检查在... 符号前面是否至少 有一个常规参数(普通形参)。如果没有,源码在编译中就会报错。除此之外,编译器也会生成进行输入参数压栈常规操作。 
正确实例:
    int func1(int a, ...)
    int func2(const char* f, ...)
    int func3(int a, int* b, const char* f, ...)


错误实例:
    int func5(...)
    int func5(int a, const char* f,

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值