【问题标题】:Segmentation Fault on fopenfopen 上的分段错误
【发布时间】:2013-04-08 13:01:00
【问题描述】:

我的代码的第一行出现了一个奇怪的分段错误。

我所做的就是打电话

FILE *src = fopen(argv[1], 'r');

我在 gdb 中的消息出现 seg 错误...

程序收到信号SIGSEGV,分段错误。

0x00007ffff779956d in _IO_file_fopen () from /lib/x86_64-linux-gnu/libc.so.6

我将文件名直接复制到运行时执行中。想法?

【问题讨论】:

  • 而您确实将参数传递给您的程序?
  • 你的编译器应该给出一个警告你的参数是错误的。

标签: c


【解决方案1】:

fopen() 的第二个参数应该是字符串,而不是char

FILE *src = fopen(argv[1], "r");

注意双引号。

打开编译器警告并密切关注它们总是一个好主意。我的编译器选择了错误的参数:

test.c:4:1: warning: passing argument 2 of 'fopen' makes pointer from integer without a cast [enabled by default]
In file included from test.c:1:0:
/usr/include/stdio.h:250:7: note: expected 'const char *' but argument is of type 'int'

【讨论】:

  • @Avidanborisov:如果我没记错的话,它被隐式转换为指针。
  • @someguy 但是不存在整数和指针之间的隐式转换(0除外)。
  • @Avidanborisov:规范另有说明。请参阅第 6.3.2.3 节:“整数可以转换为任何指针类型。除非前面指定 [当值为 0 时],否则结果是实现定义的,可能未正确对齐,可能不指向引用的类型,并且可能是一个陷阱表示。”
  • @NPE 给出的链接说:“涉及指针的转换,除了 6.5.16.1 的约束允许的情况外,应通过显式转换来指定” .所以即使它可以被转换,它仍然必须明确地完成。
  • @Avidanborisov 但是编译器不需要对所有违反标准的代码产生错误,所以如果代码编译是可以的。但是,需要编译器来为此类构造发出诊断信息。 gcc 和 clang 默认都是这样做的。
【解决方案2】:

可能传递的字符串不是以 null 结尾的,或者您正在访问 argv 上的无效索引

【讨论】:

    【解决方案3】:

    而不是

    FILE *src = fopen(argv[1], 'r');
    

    你需要写

    FILE *src = fopen(argv[1], "r");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-28
      • 1970-01-01
      • 2021-07-03
      • 1970-01-01
      相关资源
      最近更新 更多