我試圖通過將值傳遞給陣列來通過變數引數修改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) 上,它提供以下資訊:
arg1: 0.000000
arg2: 0.000000
arg3: 0.000000
arg4: -92559592143668871097826611732759620974286504571030640424648704.000000
在 GCC 上,它給出了以下內容:
arg1: 0.000000
arg2: 0.000000
arg3: 0.000000
arg4: 0.000000
有誰知道我犯了什么錯誤?
uj5u.com熱心網友回復:
可變引數的型別與給定的型別不匹配va_arg。
您傳遞給get_argsie的引數0, 1, 2, 3都是 type int,但是double當您嘗試使用va_arg. 這是觸發未定義行為的型別不匹配。
要么傳遞具有型別的引數double:
get_args(args, 4, 0.0, 1.0, 2.0, 3.0);
或者int用來拉斷論點:
args[i] = va_arg(argv, int);
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/317342.html
下一篇:奇怪的輸出C
