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

C 如何在Visual studio中删除调试断言错误,c,visual-studio,debugging,visual-studio-debugging,C,Visual Studio,Debugging,Visual Studio Debugging,我有一个程序来读取目录中的文件名。代码在CodeBlocks IDE中运行,但在Visual Studio中运行时,同样会出现调试断言错误 我在预处理器属性中添加了\u CRT\u SECURE\u NO\u警告,因为没有它strerror()会给我一个错误 #include <windows.h> #include <stdio.h> void listdirs(wchar_t *dir, wchar_t *mask) { wchar_t *fspec1 = { L'

我有一个程序来读取目录中的文件名。代码在CodeBlocks IDE中运行,但在Visual Studio中运行时,同样会出现调试断言错误

我在预处理器属性中添加了\u CRT\u SECURE\u NO\u警告,因为没有它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;
}
#包括
#包括
无效列表目录(wchar\u t*dir,wchar\u t*mask)
{
wchar_t*fspec1={L'\0'},*fname={L'\0'};
WIN32查找数据dta;
处理hDta;
德沃德·德拉斯特罗;
LPCWSTR fspec=重新解释铸件(fspec1);
char*buff={'\0'};
swprintf(fspec1100,L“%s/%s”,dir,mask);
if((hDta=FindFirstFile(fspec,&dta))==无效的句柄值){
Dlastror=GetLastError();
printf(“错误:%s\n”,strerror(dLastError));
}
否则{
做{
if(!(dta.dwFileAttributes和文件属性目录))
{
printf(“%ws\n”,dta.cFileName);
}
其他的
{
如果(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“\\.*);
返回0;
}
如果输出无法访问文件夹,则应打印错误消息或打印文件名。在任何一种情况下,我都只会得到一个调试断言错误。

带有定义

wchar_t *fspec1 = { L'\0' }, *fname = { L'\0' };
您说
fspec1
fname
都是指针,指向
NULL
。试图以任何方式取消引用这些指针都会导致错误

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

swprintf(fspec1, 100, L"%s/%s", dir, mask);
您需要为这些指针实际指向的对象分配内存。或者将它们定义为大小合适的阵列:

wchar_t fspec1[100], fname[100];

在调试器中运行调试生成、在断言发生时捕获断言以及在代码中定位断言发生位置的时间。