【问题标题】:Debug Assertion Failed. nullptr调试断言失败。空指针
【发布时间】:2016-07-13 07:17:48
【问题描述】:

我开始编程,我正在使用 Visual Studio。我有一个几天前可以运行的简单程序,但是在使用另一个项目后,它返回了一个错误:

#define _CRT_SECURE_NO_DEPRECATE
#include <stdio.h>
#include <math.h>

int main() {
    double a = 3;
    FILE *A;

    scanf("%lf", &a);

    A = fopen("B:\\Mis Documentos\\Coding\\Test 200.txt", "wt");
    fprintf(A, "Hello World, I have %lf", a);
    fclose(A);

}

但我无法编译它,它返回给我this error。这是日志:

'Project1.exe' (Win32): Loaded 'B:\Mis Documentos\Documents\Visual Studio 2015\Projects\Project1\Debug\Project1.exe'. Symbols loaded.
'Project1.exe' (Win32): Loaded 'C:\Windows\System32\ntdll.dll'. Symbols loaded.
'Project1.exe' (Win32): Loaded 'C:\Windows\System32\kernel32.dll'. Symbols loaded.
'Project1.exe' (Win32): Loaded 'C:\Windows\System32\KernelBase.dll'. Symbols loaded.
'Project1.exe' (Win32): Loaded 'C:\Windows\System32\vcruntime140d.dll'. Symbols loaded.
'Project1.exe' (Win32): Loaded 'C:\Windows\System32\ucrtbased.dll'. Symbols loaded.
'Project1.exe' (Win32): Loaded 'C:\Windows\System32\api-ms-win-core-timezone-l1-1-0.dll'. Symbols loaded.
'Project1.exe' (Win32): Loaded 'C:\Windows\System32\api-ms-win-core-file-l2-1-0.dll'. Symbols loaded.
'Project1.exe' (Win32): Loaded 'C:\Windows\System32\api-ms-win-core-localization-l1-2-0.dll'. Symbols loaded.
'Project1.exe' (Win32): Loaded 'C:\Windows\System32\api-ms-win-core-synch-l1-2-0.dll'. Symbols loaded.
'Project1.exe' (Win32): Loaded 'C:\Windows\System32\api-ms-win-core-processthreads-l1-1-1.dll'. Symbols loaded.
'Project1.exe' (Win32): Loaded 'C:\Windows\System32\api-ms-win-core-file-l1-2-0.dll'. Symbols loaded.
Debug Assertion Failed!

Program: ...ments\Visual Studio 2015\Projects\Project1\Debug\Project1.exe
File: minkernel\crts\ucrt\src\appcrt\stdio\output.cpp
Line: 31

Expression: stream != nullptr

For information on how your program can cause an assertion failure, see the Visual C++ documentation on asserts.

【问题讨论】:

  • 这不是编译器错误。您的程序有错误,您需要对其进行调试。一方面,您没有检查 fopen 是否返回 NULL。
  • 从阅读fopen/fprintf的文档开始(例如,fopen返回一个指向打开文件的指针,空指针值表示错误),并使用调试器,你很快就会看到。你也标记了这个 c++,但它真的只是 C 吗?
  • fopen() 的第二个参数中的“t”应该做什么?这可能导致调用失败。
  • @DanHydar 这意味着以文本模式打开文件,这很好,在这里做正确的事情。

标签: c++


【解决方案1】:

你没有检查文件是否真的被打开了。您应该在调用fopen后检查文件是否真的打开了

FILE *A = NULL;
....
A = fopen("B:\\Mis Documentos\\Coding\\Test 200.txt", "wt");
//Check if file was actually opened
if(A) {
....
}

查看有关此功能的文档,例如 here。您还应该初始化A 变量,这是一个很好的做法。

【讨论】:

  • 最好只写FILE * A = fopen(...,不是吗?
  • 这种方式也是初始化的,不过他的代码流程可能不一样,比如这个指针会在某个函数中通过引用传递,这里调用了fopen,最好养成习惯初始化一切。
【解决方案2】:

最后是我的错,我没有在我想要文件的地方创建文件夹“编码”。我现在可以完成我想做的事情,但是我看到如果我想在我的 Google Drive 文件夹中创建文件,有时会起作用而其他人不会。不知道为什么,可能是因为它连接到互联网?

无论如何,非常感谢您的快速帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-14
    • 1970-01-01
    • 2015-05-03
    • 2021-12-07
    • 2018-06-13
    • 1970-01-01
    相关资源
    最近更新 更多