通过变量参数修改数组

Rab*_*ios 2 c variadic-functions

我试图通过将值传递va_arg给数组来通过变量参数修改数组,但由于某种原因它给出了奇怪的结果,这是代码:

#include <stdio.h>
#include <stdarg.h>

void get_args(double* args, int argc, ...);

void get_args(double* args, int argc, ...) {
    va_list argv;
    va_start(argv, argc);

    if (argc == 1) {
        args[0] = va_arg(argv, double);
    }
    else if (argc == 4) {
        for (int i = 0; i < argc; i++) {
            args[i] = va_arg(argv, double);
        }
    }

    va_end(argv);
}

int main(void) {
    double args[4] = { 0, 0, 0, 0 };
    get_args(args, 4, 0, 1, 2, 3);

    for (int i = 0; i < 4; i++) {
        printf("args[%d] = %f\n", i, args[i]);
    }
    
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在 Visual Studio (MSVC) 上,它给出以下内容:

args[0] = 0.000000
args[1] = 0.000000
args[2] = 0.000000
args[3] = -92559592143668871097826611732759620974286504571030640424648704.000000
Run Code Online (Sandbox Code Playgroud)

在 GCC 上,它给出以下内容:

args[0] = 0.000000
args[1] = 0.000000
args[2] = 0.000000
args[3] = 0.000000
Run Code Online (Sandbox Code Playgroud)

有人知道我犯了什么错误吗?

dbu*_*ush 6

可变参数的类型与指定的类型不匹配va_arg

get_args您传递给ie的参数0, 1, 2, 3都是 type ,但是当您尝试使用 检索它们时,int您正在使用 type 。这是类型不匹配,会触发未定义的行为doubleva_arg

传递具有类型的参数double

get_args(args, 4, 0.0, 1.0, 2.0, 3.0);
Run Code Online (Sandbox Code Playgroud)

或者用int以下方法来论证:

args[i] = va_arg(argv, int);
Run Code Online (Sandbox Code Playgroud)