【问题标题】:What (might) happen if I use fclose() when fopen() failed [closed]如果我在 fopen() 失败时使用 fclose() 会发生什么(可能)[关闭]
【发布时间】:2013-02-04 03:31:04
【问题描述】:

这是我相对简单的场景,我想知道是否可以为自己节省一个条件并稍微整理一下代码。它的生产代码是别人写的,我正在整理。它根本没有 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 标准,但我不清楚结果会是什么。

提前干杯

史蒂夫

【问题讨论】:

  • 不,你不需要,因为fp 在那个时候保证为空。你忘记了之前的支票吗? if (((fp = fopen (config_file, "r+")) == NULL)。你的if语句没用,永远不会被输入
  • 您可能打算将|| 代替&& 放在第一个if 语句的条件中。
  • 对不起,应该是 ||不是 &&

标签: c fopen fclose


【解决方案1】:

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

【讨论】:

  • 感谢您的澄清...我将把条件留在原处。干杯
  • @Steve:第二次检查 (if (fp != NULL)) 以及调用它所保护的 fclose()不需要必要的!正如Ed 已经提到的。 S 对 OP 的评论。
【解决方案2】:

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

【讨论】:

  • 谢谢,任何东西从任何孔口飞出的想法可能足以让我保持条件到位:)
猜你喜欢
  • 1970-01-01
  • 2011-12-31
  • 2017-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-14
  • 2020-09-18
  • 1970-01-01
相关资源
最近更新 更多