如何删除 Visual studio 中的调试断言错误

How to remove the Debug Assertion Error in Visual studio

我有一个程序可以读取目录中的文件名。 CodeBlocks IDE 中的代码 运行s 但当我在 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'[=11=]' }, *fname = { L'[=11=]' };
WIN32_FIND_DATA     dta;
HANDLE              hDta;
DWORD dLastError;
LPCWSTR fspec = reinterpret_cast<LPCWSTR>(fspec1);
char *buff = { '[=11=]' };

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;
}

如果无法访问文件夹或打印文件名,输出应该打印一条错误消息。在任何一种情况下,我只会收到调试断言错误。

有了定义

wchar_t *fspec1 = { L'[=10=]' }, *fname = { L'[=10=]' };

你说fspec1fname都是指针,指向NULL。尝试以任何方式取消引用这些指针将导致 undefined behavior.

并且您取消引用这些指针,甚至尝试写入这些空指针指向的位置。例如

swprintf(fspec1, 100, L"%s/%s", dir, mask);

您需要为这些指针实际指向分配内存。或者将它们定义为适当大小的数组:

wchar_t fspec1[100], fname[100];