我知道这是一个经常被问到的问题,我希望有人可以帮我解决这个问题......
这是一段非常简单的代码,我正在尝试打开一个文件,而该文件不存在。我想根据需要处理这个错误并继续移动,但是当我尝试将它与NULL进行比较时,文件指针会产生分段错误...请参阅下面的代码:
FILE* file = fopen(res, "r");
if(file == NULL)
{
printf("NO CONFIG FILE");
return 0;
}
即使res指向的文件不存在,如果(file == NULL)进行此比较时发生分段错误,如果我使用if(file == 0)也失败。我真的在我的智慧结束,任何输入将不胜感激!
这里只是一个快速更新......
当我删除代码以检查文件指针的有效性,并且文件在那里时,代码正常工作。问题似乎出现在我对文件指针的评估中......
答案 0 :(得分:4)
第if(file == NULL)
行不会导致您的程序崩溃。如果你使用像gdb这样的调试器,它会显示确切的崩溃位置,这是在其他地方。
您可能认为发生这种情况的原因是因为您未在printf()
电话中打印换行符。默认情况下,当stdout是终端时,stdout是行缓冲,这意味着在您打印换行符或使用fflush()
自行刷新换行符之前,它不会被刷新。但是,如果您的程序在刷新之前崩溃,则任何缓冲的数据都会丢失。
答案 1 :(得分:2)
您还需要:
#include <stdio.h>
如果不这样做,在C89 fopen
被视为返回int
,当您将其转换为FILE *
并取消引用时会导致未定义的行为。您应该收到编译器警告。
在C99中,此代码是非法的,但如果您没有以符合模式调用,则编译器可能无论如何都要通过它。
答案 2 :(得分:0)
如果我用一些随机字符串(“abcd”)替换“res”,相同的代码在我的机器上运行得非常好。 “res”可能存在一些问题,其余代码适合工作。