尝试将函数与参数变量一起使用时发生C ++内存冲突错误

问题描述

我想创建一个函数,该函数会将信息记录到文件中。此函数需要获取一些参数,并应对其进行迭代并将其打印到控制台。我有以下代码

void log(int argnum ...)
{
    va_list arguments;
    std::string argval;
    va_start(arguments,argnum);

    for (int i = 0; i < argnum; i++) {
        argval = va_arg(arguments,std::string);
        std::cout << argval;
    }

    va_end(arguments);
}

当我尝试这样调用函数时:

log(10,"somebody","once","told","me","the","world","is","gonna","roll","me");

Visual Studio打开“ memcpy.asm”,并且出现访问冲突错误。知道有什么问题吗?

解决方法

坦率地说,您的代码有点混乱。您声明log接受类型为int的参数:

void log(int argnum ...)

然后,您尝试以std::string的身份获得它们:

argval = va_arg(arguments,std::string);

然后尝试使用类型为intconst char[]的参数调用该函数。而且,您似乎对如何处理参数数量有误解。

在大多数情况下,可变参数函数模板是vararg函数的更好选择:

#include <iostream>

template <typename ...T>
void log(const T& ... args)
{
    (std::cout << ... << args) << '\n';
}