C语言使用可变参数va_arg修改数组出现异常输出问题求助
错误原因
你的代码触发了C语言标准定义的未定义行为,核心问题是va_arg读取的类型和实际传入的可变参数类型不匹配:
- 你在
main函数调用get_args时,传入的可变参数0、1、2、3都是int类型字面量 - 在
get_args内部你通过va_arg(argv, double)尝试将这些参数按double类型读取,两种类型的内存长度、存储布局完全不同,自然会读取到错误值。
不同编译器输出不一致是未定义行为的典型表现,标准没有对这类错误的处理做强制要求,不同编译器的底层处理逻辑不同,就会出现MSVC输出乱码值、GCC输出全0的差异。
修复方案
你可以任选以下一种方案修改:
- 方案1:调用函数时传入
double类型的参数,给整数字面量添加.0后缀即可:
get_args(args, 4, 0.0, 1.0, 2.0, 3.0);
- 方案2:保持传入
int类型参数不变,修改va_arg的读取类型为int,再转换为double赋值给数组:
args[i] = (double)va_arg(argv, int);
修改后运行即可得到预期输出:
args[0] = 0.000000 args[1] = 1.000000 args[2] = 2.000000 args[3] = 3.000000
内容的提问来源于stack exchange,提问作者Rabios
相关产品推荐
相关产品推荐

