分段错误遍历文本文件

chi*_*ber 2 c gcc segmentation-fault

我有这个代码,它应该逐个字符地读取文本文件,然后用它做一些事情,但是代码在第6行继续进行segfaulting.

#include <stdio.h>

int main(void) 
{
    printf("a\n");
    FILE* fp = fopen("~/pset5/dictionaries/small", "r");
    for (int a = fgetc(fp); a != EOF; a = fgetc(fp))
    {
        printf("b\n");        
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

肯定会发生一些奇怪的事情,因为它甚至不会打印"a\n"到终端,甚至printf在错误之前调用也很困难.我用gdb运行程序,这就是它失败的地方.

6           for (int a = fgetc(fp); a != EOF; a = fgetc(fp))
(gdb) n

Program received signal SIGSEGV, Segmentation fault.
_IO_getc (fp=0x0) at getc.c:38
38      getc.c: No such file or directory.
Run Code Online (Sandbox Code Playgroud)

我也用valgrind运行它valgrind --leak-check=full ./test,测试是可执行文件的名称,这是相关的错误消息:

==7568== Invalid read of size 4
==7568==    at 0x4EA8A21: getc (getc.c:38)
==7568==    by 0x4005ED: main (test.c:6)
==7568==  Address 0x0 is not stack'd, malloc'd or (recently) free'd
==7568== 
==7568== 
==7568== Process terminating with default action of signal 11 (SIGSEGV)
==7568==  Access not within mapped region at address 0x0
Run Code Online (Sandbox Code Playgroud)

我真的在这里不知所措,有人可以解释这个分段错误发生了什么,以及为什么地狱不是第一次printf打印任何东西?

mel*_*ene 5

正如调试器所说的那样(fp=0x0),您正在fgetc使用空指针进行调用.这是导致崩溃的原因.

fp为null,因为fopen调用失败.您需要检查错误.

打开文件失败,因为很可能您没有调用目录~.回想一下,~当您键入命令时,扩展到您的主目录是由shell完成的.fopen只需要真实的文件名.