变量参数崩溃的 C 函数

C function with variable arguments crashing

本文关键字:函数 崩溃 参数 变量      更新时间:2023-10-16

我写了一个函数来帮助我调试一个项目:

    static void outputDebug(unsigned uintLineNo, const char* cpszFormat, ...) {
        char szPrefix[80], szOut[256];
        va_list ap;
        va_start(ap, cpszFormat);
        sprintf_s(szPrefix, sizeof(szPrefix), "%s %s %05ld %sn"
                          , __DATE__, __TIME__, uintLineNo, cpszFormat);
        vsprintf_s(szOut, sizeof(szOut), "%s", szPrefix, ap);   
        va_end(ap);
        OutputDebugString(szOut);
    }

此函数的示例:

    outputDebug(__LINE__, "AdapterInit(%s)", "Test");

格式字符串 AdapterInit(%s) 之后的所有内容都是可选的,我已经单步执行了该函数,它毫无问题地构造了szPrefix,例如,这将包含类似的东西; Apr 18 2018 07:33:07 01492 Adapter(%s)

下一行vsprintf导致异常:

    Unhandled exception at 0x0781e9ee (msvcr90d.dll) in ....

看不到我做错了什么,我该如何解决这个问题?

[编辑] 问题出在vsprintf开始的行中,删除不必要的%s解决了问题。

工作解决方案:

    static void outputDebug(unsigned uintLineNo, const char* cpszFormat, ...) {
        char szPrefix[80], szOut[256];
        va_list ap;
        va_start(ap, cpszFormat);
        sprintf_s(szPrefix, sizeof(szPrefix), "%s %s %05ld %sn"
                          , __DATE__, __TIME__, uintLineNo, cpszFormat);
        vsprintf_s(szOut, sizeof(szOut), szPrefix, ap); 
        va_end(ap);
        OutputDebugString(szOut);
    }

如果我收集正确,您将szPrefix构造为新的格式字符串(通过将cpszFormat插入其中,添加前缀(。因此,对vsprintf_s的调用应该使用它,而不是%s .即

vsprintf_s(szOut, sizeof(szOut), szPrefix, ap);   

你为szPrefix选择的尺寸(80(也是相当乐观的。可能值得将其增加一两个档次。