4

当我使用 va_arg(ap,double) 运行此示例程序时,我发现 va_arg 返回无效数据,如 0 而不是 3 或 1.2 而不是 1,这样如果我传递不带 .00 而不是 double 格式的整数值,它会得到一个垃圾数据(即 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
4

2 回答 2

3

可变参数函数(即,采用省略号 ( ...) 参数指示的可变数量参数的函数)在 C 中具有弱类型化。除了某些特殊函数(如printfand )之外scanf,编译器不会努力验证您是将正确类型的参数传递给他们。

在您的情况下,该函数需要一个double参数,但您试图传入一个int. 编译器不会在此处从intto进行任何提升double,因此会导致未定义的行为。您需要始终在double此处传入一个值,或者作为显式double常量值,例如1.0,或者使用类型转换执行转换。

于 2012-09-25T17:16:37.240 回答
1

好吧,3并且1是整数而不是双精度数。它们对这些数字的二进制表示不同于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
于 2012-09-25T17:21:22.827 回答