请帮忙!我对C一无所知,但我必须对C代码做一个小小的补充。
我从GetLastError中得到一个错误号(int)并将其显示到表单中。相反,我需要得到实际的错误字符串。
我添加了对FormatMessage的调用。调用本身工作正常,但字符串无法打印(使程序崩溃)。我做错什么了?

wchar_t *textbuf;

if(textbuf==NULL)
        {
            textbuf=(wchar_t *)malloc(4096);
            memset(textbuf,0,4096);
        }

wchar_t *lpMsgBuf;
            FormatMessage(
                FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
                NULL, rc, // rc is an int, returned from another function, the result of GetLastError()
                MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
                (LPWSTR)lpMsgBuf, 0, NULL);
swprintf(textbuf, L"%s%s%s\n", textbuf, L"\t\t\t", lpMsgBuf);

最佳答案

问题是您没有正确地将lpMsgBuf传递给FormatMessage(),并且您的textbuf缓冲区管理不正确。
FormatMessage() documentation表示:
格式化消息分配缓冲区
0x00000100号
函数分配一个足够大的缓冲区来保存格式化的消息,并在lpBuffer指定的地址处放置一个指向已分配缓冲区的指针。lpBuffer参数是指向LPTSTR的指针;必须将指针强制转换为LPTSTR(例如,(LPTSTR)&lpBuffer)。nSize参数指定为输出消息缓冲区分配的最小TCHARs数。调用方应在不再需要缓冲区时使用LocalFree函数释放缓冲区。
由于您没有将lpMsgBuf初始化为空,也没有将lpMsgBuf的地址传递给FormatMessage()以便它可以将分配的内存地址分配给lpMsgBuf,因此您最终将垃圾内存地址传递给swprintf()作为最终输入参数。
至于textbuf,您没有将其初始化为NULL,因此您将跳过对malloc()的调用,从而将其输出缓冲区和第一个输入参数的垃圾地址传递给swprintf()。但无论如何,不能对输入和输出使用相同的缓冲区,这是未定义的行为。
请改为:

wchar_t *textbuf = (wchar_t *) malloc(4096);
memset(textbuf, 0, 4096 * sizeof(wchar_t));

wchar_t *lpMsgBuf = NULL;
FormatMessage(
    FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
    NULL, rc, // rc is an int, returned from another function, the result of GetLastError()
    MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
    (LPWSTR)&lpMsgBuf, 0, NULL);
swprintf(textbuf, L"\t\t\t%s\n", lpMsgBuf);
LocalFree(lpMsgBuf);

// use textbuf as needed...
free(textbuf);

关于c - C新手:swprintf为什么对我失败?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32157759/

10-10 16:53