int gb2Utf8(const char* source, int sourceLen, void *target, int targetLen)
{
int result = 0;
int bufLen = strlen(source) * 2;
wchar_t *buffer = (wchar_t *)malloc(bufLen);
if (!buffer)
{
result = 1;
goto RETURN;
}
//GB18030 code page: 54936
int m2wResult = MultiByteToWideChar(54936, MB_ERR_INVALID_CHARS, source, -1, buffer, bufLen);
if (!m2wResult)
{
result = 2;
goto RETURN;
}
int w2mResult = WideCharToMultiByte(CP_UTF8, WC_ERR_INVALID_CHARS, buffer, -1, (char *)target, targetLen, NULL, NULL);
if (!w2mResult)
{
result = 3;
goto RETURN;
}
RETURN:
free(buffer);
return result;
}
当程序运行到 时free(buffer)
,它会崩溃,但我不知道为什么。
如果修改bufLen
成一个常数值,或者删除MultiByteToWideChar
函数,它不会崩溃,我也不知道为什么。这是崩溃时的调用堆栈:
msvcr100d.dll!_free_dbg_nolock(void * pUserData, int nBlockUse) 第 1376 行 + 0x3b 字节 C++
msvcr100d.dll!_free_dbg(void * pUserData, int nBlockUse) 第 1265 行 + 0xd 字节 C++
msvcr100d.dll!free(void * pUserData) 第 49 行+ 0xb 字节 C++
New.exe!gb2Utf8(const char * source, int sourceLen, void * target, int targetLen) 第 156 行 + 0xc 字节 C++
New.exe!wWinMain(HINSTANCE__ * hInstance, HINSTANCE__ * hPrevInstance, wchar_t * lpCmdLine, int nCmdShow) 第 29 行 + 0x11 字节 C++
New.exe!__tmainCRTStartup() 第 547 行 + 0x2c 字节 C
New.exe!wWinMainCRTStartup() 第 371 行 C
kernel32.dll!7509339a()
[下面的帧可能不正确和/或丢失,否为 kernel32.dll 加载的符号]
ntdll.dll!77979ef2()
ntdll.dll!77979ec5()