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

标签 c arguments

这个问题不太可能对任何 future 的访客有帮助;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况相关,通常不适用于互联网的全局受众。如需帮助使这个问题更广泛适用,visit the help center .




9年前关闭。




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

最佳答案

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

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

关于c - va_arg( , double) 每次返回一个无效值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12587860/

相关文章:

arguments - 在 JSDoc 中记录解构函数参数

c - 哈希表 - 链表 - 段错误

c - 如何检查参数是否传递给 C 中的函数?

c - EnumWindows 和 CloseHandle

c - 如何使用 gedit/gcc 在 Ubuntu 中制作一个 C 项目文件或多个开源文件我是新手请指导我

Python - 干净地传递参数

c - 带有指向结构内部 char 的指针的段错误,ANSI C 代码

c++ - 为什么在 C/C++ 中交织 switch/for/if 语句是有效的?

c - 如何在微 Controller 上使用外部存储器