va_arg(,double)每次返回无效值

当我使用va_arg(ap,double)运行这个示例程序时,我发现va_arg返回无效数据,为0而不是3或1.2而不是1,这样如果我传递没有.00而不是double格式的整数值就会得到一个垃圾数据(即3而不是3.00)!

#include  #include  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 

变量函数(即,由省略号( ... )参数指示的可变数量的参数的函数)在C中具有弱类型。除了某些特殊函数(如printfscanf的情况下,编译器不做任何努力validation您是否向他们传递了正确类型的参数。

在你的情况下,函数期望一个double参数,但你试图传入一个int 。 编译器不会在此处执行任何从intdouble提升,因此会产生未定义的行为。 您需要始终在此处传递double值,作为显式double常量值(如1.0 ,或使用类型转换执行转换。

好吧, 31是整数而不是双打。 它们对这些数字的二进制表示不同于3.01.0

 var(1,3.9); var(1,1.2); var(1,5.7); $ ./a ac,17,Sep 25 2012 func: 18 3.900000 1.200000 5.700000