va_list值始终为-52,并使用字符串崩溃

va_list value is always -52 and crashes using strings

本文关键字:崩溃 字符串 list va      更新时间:2023-10-16

我试图使用多个参数,但它不起作用。这是问题所在的代码,也是接受参数的代码。

void CLog::Write(char lvl, char id, const std::string& sMsg, ...)
{
    FASSERT(m_pLogger != nullptr);
    va_list args;
    va_start(args, sMsg);
    char szBuf[1024];
    vsprintf(szBuf, sMsg.c_str(), args);
    va_end(args);
    m_pLogger->Write(lvl, id, szBuf);
}

当我调用时使用此代码

CLog::Write(FLOG_LVL_INFO, FLOG_ID_APP, "Vertices: %u", m_vertices.size() );

该输出

2013-11-30 - 15:02:45 -  INFO   - Vertices: 3435973836

当我试图传递更多像这样的字符串时

const char * fragment_file_path = "My shader path"; // some path to shader
CLog::Write(FLOG_LVL_INFO, FLOG_ID_APP, "Compiling shader : %sn", fragment_file_path);

然后程序崩溃并给出这个

Unhandled exception at 0x560616B3 (msvcr110d.dll) in Fabian.exe: 0xC0000005: Access violation reading location 0xCCCCCCCC.

我已经将代码与其他示例进行了比较,并再次检查了va_list和vsprintf的引用,但我似乎没有发现任何错误。

除了初始化fragment_file_pathva_arg在其实现中执行sizeofsizeof(sMsg)将是sizeof(string),以确定堆栈上下一个参数的起始位置,这是错误的,因为sMsg是对字符串的引用,而不是字符串。

不能将引用用作varargs的最后一个命名参数;使用值或指针。