【问题标题】:How to remove the Debug Assertion Error in Visual studio如何在 Visual Studio 中删除调试断言错误
【发布时间】:2019-01-31 07:12:55
【问题描述】:

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

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

【问题讨论】:

  • 是时候在调试器中运行调试构建,在断言发生时捕获断言并在 您的 代码中定位它发生的位置。

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


【解决方案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];

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 2014-09-09
    相关资源
    最近更新 更多