错误的 vsnprintf 输出

Wrong vsnprintf output

我有以下功能:

void raiseError(const char *msg, ...)
{
    va_list ap;
    va_start(ap, msg); // use variable arg list

    int size = vsnprintf(nullptr, 0, msg, ap);
    std::vector<char> s(size+1, 0);
    vsnprintf(s.data(), size, msg, ap);
    va_end(ap);
    errorString = std::string(s.data()));
}

当我打电话时

raiseError("File not found in <%s> : <%s>", "a", "b" );

第一次 vsnprintf 调用(计算最终字符串大小)returns正确值为 27。但最终字符串是:

"File not found in <**A*> :"

“*”字符在程序启动时随机出现。

此外,该程序在 MinGW 中运行,该问题仅在 linux gcc 中出现。

我的代码有什么问题?

你不能多次使用 ap。考虑使用 va_copy.