为什么使用fscanf会导致应用程序崩溃?

新的C编程。

以下部分代码尝试从文本文件(utf-8)中读取一个制表符分隔的MD5(32个字符)和相应的描述(最多128个字符)的列表,但导致应用程序崩溃:

HANDLE hFile = CreateFileW(good_path, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL); if (hFile == INVALID_HANDLE_VALUE) { return FALSE; } LPWSTR md5 = malloc(sizeof(wchar_t) * 32); LPWSTR desc = malloc(sizeof(wchar_t) * 128); int i; while((i = fwscanf(hFile, L"%ls %ls", md5, desc)) != EOF) { if (i == 2) // OK { } else // Something went wrong { } } CloseHandle(hFile); return TRUE; 

几个问题:

  1. 我使用malloc(…)是否正确?
  2. 什么可能导致崩溃?

更新1

我已经把这个代码,并成为一个独立的exe(而不是一个DLL)。 仍然崩溃。

更新2

根据Chris的评论更新为fwscanf。 仍然崩溃。 如果我注释掉while...fwscanf...行,它会正常退出。

CreateFileW()返回一个Windows句柄,这有点像一个文件编号,但是不同。 fwscanf()需要FILE*不是Windows句柄; 得到一个FILE*fopen()_wfopen()打开你的文件。

  1. %s存储一个空终止符。 Malloc 33和129字符。

%s在您提供的地址下存储一个nul结尾的字符串。 要存储n个没有缓冲区溢出的重要字符,需要提供n + 1个长缓冲区的地址。