通过可变参数修改数组
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);
我试图通过将 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);