对于可变参数列表,va_list本质的探究(C语言)
2016-09-26 20:14
447 查看
由于已经有很多的相关资料,本文不赘述 关于可变参数列表 和va_start,va_end,va_list的简单应用,直接进入正题。
1、va_list是如何实现指向下一个参数的
请大家先看一个很简单例子,但是实现了va_list 的基本功能:
想搞明白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 更新
笑斐戈
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 更新
笑斐戈
相关文章推荐
- 详解C语言可变参数 va_list和_vsnprintf及printf实现
- C语言(函数传递可变长度的参数列表)va_arg
- C++可变参数列表处理宏va_list、va_start、va_end的使用
- 详解_C语言可变参数_va_list和_vsnprintf及printf实现
- c语言可变参数va_list,va_start用法与分析
- 可变参数列表(va_list,va_arg,va_copy,va_start,va_end)
- 详解C语言可变参数va_list和vsnprintf及printf实现
- c语言 可变参数传递 va_list使用
- 关于可变的参数列表va_list的笔记
- C语言利用va_list、va_start、va_end、va_arg宏定义可变参数的函数
- C语言中的可变参数:va_list ,va_start,va_arg,va_end
- C语言中可变参数的处理va_list
- C语言中可变参数的用法——va_list、va_start、va_arg、va_end参数定义
- 详解C语言可变参数 va_list和_vsnprintf及printf实现
- 可变参数列表(va_list,va_arg,va_copy,va_start,va_end)
- 详解_C语言可变参数_va_list和_vsnprintf及printf实现
- C语言可变参数,va_arg、va_list,va_start,va_end,_INTSIZEOF浅析
- C语言中可变参数的用法——va_list、va_start、va_arg、va_end参数定义
- 详解C语言可变参数va_list和vsnprintf及printf实现
- C语言中可变参数的用法——va_list、va_start、va_arg、va_end参数定义