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

如下代码为什么输出的结果不是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;
}
阅读 986
avatarAI BotBETA

这段代码中的问题在于如何在 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;
}
2 个回答

printValues 期望后面是一堆 int ,但是传给它的是一个 va_listva_list 不是 int,当然就不对了。

如果想想现在这样调用,那么 printValues 的参数就应该是 va_list args ,而不是 ...

printValues(int count, va_list args)


C 的 printf 就有 v 系列函数,比如:
int vprintf(const char *format, va_list arg);
就是用 va_list 作为参数。

你把同一件事做了两遍,你的processValues函数是不需要的,直接调用printValues(4, 1, 2, 3, 4)即可。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题