Как удалить ошибку утверждения отладки в Visual studio - PullRequest
0 голосов
/ 31 января 2019

У меня есть программа для чтения имен файлов в каталоге.Код выполняется в среде IDE CodeBlocks, но при запуске в 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 голосов
/ 31 января 2019

С определениями

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];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...