【问题标题】:fscanf - segmentation fault (core dumped) in Cfscanf - C 中的分段错误(核心转储)
【发布时间】:2013-11-23 12:23:38
【问题描述】:

当遇到一个我以前从未遇到过的问题时,我正在尝试编写一个小程序。 fscanf 函数中似乎存在分段错误,但无法真正解决问题。这是我的代码:

#include <stdio.h>

int main(){
    FILE *fin = ("file.in", "r");
    int n, t;
    fscanf(fin, "%d %d", &n, &t);
    return 0;
}

还有文件.in:

3 19

希望你有一些想法。任何帮助表示赞赏!
鲁吉尔:)

【问题讨论】:

  • 为什么,哦,为什么你没有在编译时启用警告? 为什么?
  • @H2CO3 编译带有警告是 GCC 的默认设置 :-)
  • @KVD 但还不够。至少-Wall,更好-Wall -Wextra -pedantic。但无论如何,您总是可以s/compiling with/pay attention to/ 获得不同的解释。 (这同样令人难过,不是吗?)
  • @H2CO3 - 如果弹出警告,则不需要Wall。我每次都在命令行中使用 GCC :)
  • @KVD 我也是。如果没有-Wall,它不会显示所有警告。

标签: c segmentation-fault scanf


【解决方案1】:

未初始化的变量FILE *fin = ("file.in", "r"); - 导致未定义的行为。

FILE *fin = fopen ("file.in", "r");

由于逗号运算符的影响,("file.in", "r") 的计算结果为 "r",因此它可以编译。

【讨论】:

  • 但即使那样它也不应该编译。 "r" 的类型为 char [2],衰减为 char *,而 fin 的类型为 FILE *...
  • @H2CO3 - 取决于编译器(版本等)如何处理它 - 它编译 ideone.com/QyNvrv 我认为没有理由不应该这样做,因为在这两种情况下我们都会获得内存引用。问题在于类型。编译器至少应该生成一个警告。
  • @Acme 1. 什么“参考”? C 没有引用。不,它不会编译,因为指向不兼容类型的指针正在相互分配。
  • @H2CO3 - "reference" 我的意思是地址 - 我引用错误。
【解决方案2】:
FILE *fin = fopen ("file.in", "r");

如果你喜欢FILE *fin = ("file.in", "r");

GCC 报告:

warning: initialization from incompatible pointer type [enabled by default]

【讨论】:

  • 为什么不用fopen也能编译?
  • @johny 没有语法错误,但有逻辑错误和函数使用错误
  • @johny 它应该给出一个“不兼容的指针”警告:没有fopen,表达式的右值被视为comma operator,其结果将是最右边的表达式,在这种情况下"r"。这个一个有效的指针,但不是一个指向FILE的指针。因此对不兼容的指针发出警告。
猜你喜欢
  • 2013-11-28
  • 2022-01-14
  • 2017-02-25
  • 2016-07-12
  • 2018-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多