当我使用gdb从终端运行输出程序时,它总是以这个函数的分段错误结束。但是,在eclipse调试器中运行这个程序很好。
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的错误消息
[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()的替代方案,例如
while((c = fgetc(file)) != EOF)但我也得到了同样的结果
[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.有人知道这个错误是从哪里来的吗?
发布于 2017-04-19 11:58:49
请注意,while (!feof(f))始终是一个bug,因为在C中,只有在尝试读取之后才检测到文件结束条件,而不是在之前检测。
然后,您违反了两个十条戒律 (2和6),因为它不检查来自fopen的返回值,这可能是NULL,在使用文件指针时会导致分段错误。
是的,不管您告诉我们关于IDE和调试的什么,您都从fopen()获得了一个空指针,并将它传递给feof(),这实际上是在您得到的错误消息和问题标题:fp=0x0中。
发布于 2017-04-19 11:56:06
您应该检查fopen返回值。
https://stackoverflow.com/questions/43495023
复制相似问题