对于可变参数列表,va_list本质的探究(C语言)

本文探讨了va_list的工作原理,通过一个简单的示例展示了如何通过指针操作访问可变参数列表中的元素,并讨论了va_list的一个明显缺陷:无法判断是否获取了正确的参数数量。

由于已经有很多的相关资料,本文不赘述 关于可变参数列表 和va_start,va_end,va_list的简单应用,直接进入正题。

1、va_list是如何实现指向下一个参数的

请大家先看一个很简单例子,但是实现了va_list 的基本功能:


#include

#include

void fun(int cnt, ...)

{

    int *temp = &cnt;

    int i;

    temp++;//地址增加,指针指向下一个参数

    for (i = 0; i < cnt; ++i)

    {

        printf("%d",(*temp));

        temp++;

    }

}

int main()

{

    fun(4,33,2,11,0);

    return 0;

}

想搞明白va_list 是怎么工作的,我们必须先搞明白C语言​中,函数调用时是通过栈来实现的,而参数是连续存放的。比如例子中的 fun(4,33,2,11,0);的第一个参数 4,指向参数4的指针地址自增之后,就指向了第二个参数 33,以此类推。同样的,va_list实现原理也是类似的。怎么样,是不是很简单​。

程序运行结果:

​​2、va_list 的缺陷

笔者认为​va_list 的缺陷是很明显的,其无法判断 返回值是不是应得的参数;

比如 上面的例子中 ,如果这样写 fun(5,33,2,11,0); 当其读取第五个参数时,会发生不可预料的结果(这里用自己的函数来举例,和使用va_list也是类似的),这些结果可能不严重,也可能很致命,但确实是一个错误。

这种缺陷笔者目前也没有找到解决的方案,实在是很遗憾。比如C中的库函数printf,也存在着如此的缺陷;

当你如此调用时 printf(“%d,%d”,1);

运行结果:

2015-11-5 更新

笑斐戈​

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值