C 如何在Visual studio中删除调试断言错误
我有一个程序来读取目录中的文件名。代码在CodeBlocks IDE中运行,但在Visual Studio中运行时,同样会出现调试断言错误 我在预处理器属性中添加了\u CRT\u SECURE\u NO\u警告,因为没有它strerror()会给我一个错误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'
#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];
在调试器中运行调试生成、在断言发生时捕获断言以及在代码中定位断言发生位置的时间。