当我使用va_arg(ap,double)运行此示例程序时,我发现va_arg返回无效数据,为0而不是3或1.2而不是1,这样如果我传递整数值而不使用.00而不是双格式获取垃圾数据(即3而不是3.00)!
#include <stdio.h>
#include <stdarg.h>
void func(int s){
printf("%s: %d\n",__func__,s);
}
void var(int count,...){
va_list ap;
va_start(ap,count);
double a = va_arg(ap,double);
printf("%f\n",a);
va_end(ap);
}
void main(void ) {
printf("%s,%d,%s\n",__FILE__,__LINE__,__DATE__);
func(__LINE__);
var(1,3);
var(1,1.2);
var(1,1);
}
输出是:
try.c,24,Sep 25 2012
func: 25
0.000000
1.200000
1.200000
答案 0 :(得分:2)
可变参数函数(即,由省略号(...
)参数指示的可变数量参数的函数)在C中具有弱类型。除了printf
之类的某些特殊函数的情况和scanf
,编译器不会验证您是否正在向它们传递正确类型的参数。
在您的情况下,该函数需要double
参数,但您尝试传入int
。编译器不会在int
到double
进行任何促销,因此会产生未定义的行为。您需要始终在此处传递double
值,作为显式double
常量值,例如1.0
,或使用类型转换执行转换。
答案 1 :(得分:1)
好吧,3
和1
是整数而不是双打。它们对这些数字的二进制表示形式与3.0
和1.0
的二进制表示形式不同。
var(1,3.9);
var(1,1.2);
var(1,5.7);
$ ./a
a.c,17,Sep 25 2012
func: 18
3.900000
1.200000
5.700000