如果我在fopen()失败时使用fclose()会发生什么(可能)

时间:2013-02-04 03:31:04

标签: c fopen fclose

这是我相对简单的场景,我想知道我是否可以保存自己的条件并整理一下代码。它的生产代码是别人写的,我只是整理一下。它根本没有fclose,所以我添加的是条件fclose()行:

  FILE *fp;
  struct stat sb;
  /* snipped code */
  if (((fp = fopen (config_file, "r+")) == NULL) || (fstat (fileno (fp), &sb))) {
      syslog (LOG_ERR, "Fault. Unable to read config file");
      if (fp != NULL) {
          fclose (fp);
      }
      return -1;
  }
  /* code carries on after this */

问题是,我真的需要在我的代码中使用if(fp != null)吗?只是在没有检查的情况下执行fclose(fp)会有什么影响?我读过C89标准,但我不清楚结果会是什么。

提前干杯

史蒂夫

2 个答案:

答案 0 :(得分:4)

空指针上的

fclose具有未定义的行为。这意味着它可能会出现段错误或导致您出现问题。我会坚持你的检查,因为它们是很好的做法,使代码更容易阅读。

答案 1 :(得分:1)

在BSD中,fclose( NULL )会出现段错误。我相信对可能发生的经典描述是,鼻子的恶魔可能会飞出你的鼻子,但我不确定这种行为是不确定的还是未指明的。我从来没有认为它是一个非常重要的区别:只是不要这样做。