首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >分割故障:_IO_feof (fp=0x0) at feof.c:35

分割故障:_IO_feof (fp=0x0) at feof.c:35
EN

Stack Overflow用户
提问于 2017-04-19 11:53:54
回答 2查看 2.6K关注 0票数 1

当我使用gdb从终端运行输出程序时,它总是以这个函数的分段错误结束。但是,在eclipse调试器中运行这个程序很好。

代码语言:javascript
复制
ssize_t
read_from_file(char *arg, unsigned char *buf, size_t max_buf_len) {
  ssize_t result = 0;
  FILE *f = fopen(arg, "r");
  int c;
  while (!feof(f)) {
    size_t bytes_read;
    bytes_read = fread(buf, 1, max_buf_len, f);
    if (ferror(f)) {
      result = -1;
      break;
    }

    buf += bytes_read;
    result += bytes_read;
    max_buf_len -= bytes_read;
  }

  fclose(f);
  return result;
}

来自gdb的错误消息

代码语言:javascript
复制
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".

Program received signal SIGSEGV, Segmentation fault.
_IO_feof (fp=0x0) at feof.c:35
35      feof.c: No such file or directory.

我尝试使用feof()的替代方案,例如

代码语言:javascript
复制
while((c = fgetc(file)) != EOF)

但我也得到了同样的结果

代码语言:javascript
复制
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".

Program received signal SIGSEGV, Segmentation fault.
_IO_getc (fp=0x0) at getc.c:37
37      getc.c: No such file or directory.

有人知道这个错误是从哪里来的吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-04-19 11:58:49

请注意,while (!feof(f))始终是一个bug,因为在C中,只有在尝试读取之后才检测到文件结束条件,而不是在之前检测

然后,您违反了两个十条戒律 (2和6),因为它不检查来自fopen的返回值,这可能是NULL,在使用文件指针时会导致分段错误。

是的,不管您告诉我们关于IDE和调试的什么,您都从fopen()获得了一个空指针,并将它传递给feof(),这实际上是在您得到的错误消息和问题标题:fp=0x0中。

票数 3
EN

Stack Overflow用户

发布于 2017-04-19 11:56:06

您应该检查fopen返回值。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43495023

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档