我有一个程序可以读取目录中的文件名。该代码在CodeBlocks IDE中运行,但是当我在Visual Studio中运行该代码时,也会出现“调试断言错误”。
我在预处理器属性中添加了 _CRT_SECURE_NO_WARNINGS ,因为没有它,strerror()会给我一个错误。
#include <windows.h>
#include <stdio.h>
void listdirs(wchar_t *dir, wchar_t *mask)
{
wchar_t *fspec1 = { L'\0' }, *fname = { L'\0' };
WIN32_FIND_DATA dta;
HANDLE hDta;
DWORD dLastError;
LPCWSTR fspec = reinterpret_cast<LPCWSTR>(fspec1);
char *buff = { '\0' };
swprintf(fspec1, 100, L"%s/%s", dir, mask);
if ((hDta = FindFirstFile(fspec, &dta)) == INVALID_HANDLE_VALUE) {
dLastError = GetLastError();
printf("The error : %s\n", strerror(dLastError));
}
else {
do {
if (!(dta.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
{
printf("%ws\n", dta.cFileName);
}
else
{
if (wcscmp(dta.cFileName,L".") !=0 && wcscmp(dta.cFileName,L"..")!=0)
{
swprintf(fname, 100, L"%s", dta.cFileName);
listdirs(fname, mask);
}
}
} while (FindNextFile(hDta, &dta));
FindClose(hDta);
}
}
int main (int argc, char *argv[])
{
listdirs(L"C:\\windows\\system32\\Tasks", L"\\.*");
return 0;
}
如果输出无法访问该文件夹,则该输出应打印一条错误消息或输出文件名。无论哪种情况,我都只会收到调试声明错误。
答案 0 :(得分:1)
具有定义
wchar_t *fspec1 = { L'\0' }, *fname = { L'\0' };
您说fspec1
和fname
都是指向NULL
的指针。尝试以任何方式取消引用这些指针将导致undefined behavior。
您确实取消引用了这些指针,甚至尝试写入这些空指针指向的位置。例如,
swprintf(fspec1, 100, L"%s/%s", dir, mask);
您需要为这些指针实际指向分配内存。或将它们定义为适当大小的数组:
wchar_t fspec1[100], fname[100];