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

时间:2012-09-25 17:12:35

标签: c arguments

当我使用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

2 个答案:

答案 0 :(得分:2)

可变参数函数(即,由省略号(...)参数指示的可变数量参数的函数)在C中具有弱类型。除了printf之类的某些特殊函数的情况和scanf,编译器不会验证您是否正在向它们传递正确类型的参数。

在您的情况下,该函数需要double参数,但您尝试传入int。编译器不会在intdouble进行任何促销,因此会产生未定义的行为。您需要始终在此处传递double值,作为显式double常量值,例如1.0,或使用类型转换执行转换。

答案 1 :(得分:1)

好吧,31是整数而不是双打。它们对这些数字的二进制表示形式与3.01.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