通过可变参数修改数组

Modifying array via variable arguments

我试图通过将 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;
}

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

args[0] = 0.000000
args[1] = 0.000000
args[2] = 0.000000
args[3] = -92559592143668871097826611732759620974286504571030640424648704.000000

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

args[0] = 0.000000
args[1] = 0.000000
args[2] = 0.000000
args[3] = 0.000000

谁知道我做错了什么?

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

您传递给 get_args 的参数,即 0, 1, 2, 3 都是 int 类型,但您在尝试检索它们时使用的是 double 类型va_arg。这是触发 undefined behavior.

的类型不匹配

要么传递类型为 double:

的参数
get_args(args, 4, 0.0, 1.0, 2.0, 3.0);

或使用int来拉开争论:

args[i] = va_arg(argv, int);