您的位置:首页 > 编程语言 > C语言/C++

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

2016-09-26 20:14 447 查看
由于已经有很多的相关资料,本文不赘述 关于可变参数列表 和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 更新

笑斐戈​
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息