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

时间:2019-01-31 07:12:56

标签: c visual-studio debugging visual-studio-debugging

我有一个程序可以读取目录中的文件名。该代码在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;
}

如果输出无法访问该文件夹,则该输出应打印一条错误消息或输出文件名。无论哪种情况,我都只会收到调试声明错误。

1 个答案:

答案 0 :(得分:1)

具有定义

wchar_t *fspec1 = { L'\0' }, *fname = { L'\0' };

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

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

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

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

wchar_t fspec1[100], fname[100];