当前位置: 首页 > 知识库问答 >
问题:

c++ - C++可变参数输出结果错误?

和斌
2023-11-13

如下代码为什么输出的结果不是1,2,3,4?
而是输出了错误的结果:1803629872 77304476 1803629872 0

#include <iostream>#include <cstdarg>// 函数:打印可变参数的值void printValues(int count, ...) {    va_list args;    va_start(args, count);    for (int i = 0; i < count; ++i) {        int value = va_arg(args, int);        std::cout << value << " ";    }    va_end(args);}// 函数:将可变参数传递给另一个带有可变参数的函数void processValues(int count, ...) {    va_list args;    va_start(args, count);    printValues(count, args);    va_end(args);}int main() {    processValues(4, 1, 2, 3, 4);    return 0;}

共有1个答案

邓丰
2023-11-13

这段代码中的问题在于如何在 processValues 函数中正确地传递可变参数给 printValues 函数。在 C++ 中,可变参数的传递需要使用 va_list 类型和相关的宏。

在你的代码中,你已经在 printValues 函数中正确地使用了 va_list 和相关的宏来处理可变参数。然而,在 processValues 函数中,你并没有正确地复制可变参数。你只是将 args 传递给 printValues,而不是将可变参数复制到新的 va_list 中。

下面是修改后的代码,我在 processValues 函数中创建了一个新的 va_list 并使用 vprintf 函数来打印可变参数:

#include <iostream>#include <cstdarg>#include <cstdio>void printValues(int count, ...) {    va_list args;    va_start(args, count);    for (int i = 0; i < count; ++i) {        int value = va_arg(args, int);        std::cout << value << " ";    }    va_end(args);}void processValues(int count, ...) {    va_list args;    va_start(args, count);    va_list copy;    va_copy(copy, args); // 将可变参数复制到新的 va_list 中    printValues(count, copy); // 使用复制的可变参数调用 printValues 函数    va_end(args);    va_end(copy); // 不要忘记清理 copy!}int main() {    processValues(4, 1, 2, 3, 4); // 输出应为:1 2 3 4     return 0;}
 类似资料:
  • 本文向大家介绍C#中实现可变参数实例,包括了C#中实现可变参数实例的使用技巧和注意事项,需要的朋友参考一下 C语言的printf函数,参数的数量可以是可变的。使用 va_start 和 va_end  实现。 C++中,实现参数可变,可以用 overload。如果参数数量不是很多的话,可以一个参数实现一个函数,两个参数再实现一个函数,三个参数再实现一个函数... 或者使用C的方案。 C#中,也可以

  • 本文向大家介绍C语言中编写可变参数函数,包括了C语言中编写可变参数函数的使用技巧和注意事项,需要的朋友参考一下 通过stdarg.h头文件为函数提供了定义可变参数列表的能力。声明一个可变参数的函数类似: void f1(int n,...); 其中n表示参数列表个数,而用省略号来表示未知参数列表。stdarg.h中提供了一个va_list类型,用于存放参数。一个大概的使用过程类似: 看一个求和的例

  • 我已经编写了一个具有递归评估的可变参数模板函数。对于最后一个参数,我在没有可变参数包的情况下实现了专业化,并且一切正常。 现在我想把可变函数参数转换成模板参数。 这是我的尝试: gcc和clang报告了一个模糊的过载,并且无法使用空参数包在“专业化”和“可变参数”之间做出决定。 我尝试删除特化并检查可变参数模板中的包大小,但是如果没有特化,编译器就无法推断出参数“p”。

  • 以下是我的代码:< br > 一开始我只是重载了函数,发现有很多类似的代码。所以我正在考虑使用可变参数模板来获得更好的设计。(如果两个重载函数相似,如何做出更好的设计) 但是我不知道为什么会有错误:< br > main.cpp:27: 8:错误:没有匹配函数调用'getChar'ch=getChar(1, std::forward(str)...); 主要的cpp:37:2:注意:在函数模板专门

  • 在这个程序中,我必须打印1到100之间的素数。要遵循的方法是——要找出素数,用存储在数组中的前一个素数除以一个数。如果给定的数字在除以任何前一个素数时留下0作为余数,那么它就不是素数。如果不是,它就是一个素数,并将其添加到数组中。在程序中——我初始化了一个由100个数字组成的数组,并将1到100个数字存储在数组a中(步骤1)。是我将存储素数的数组。我在(步骤2)中存储了的前两个值。在(步骤3)中,

  • 本文向大家介绍C++输入输出注意事项总结,包括了C++输入输出注意事项总结的使用技巧和注意事项,需要的朋友参考一下 本文总结了C++输入输出的各种注意事项,对于C++初学者或C++程序员来说都有一定的借鉴参考价值。具体总结分析如下: 一、string类: 1.cin>>string时,遇到'\n'或者空格即停止,并且'\n'或空格仍留在输入里,即只读了一个单词或什么都没读,但string类自己处理