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打印任何东西?
正如调试器所说的那样(fp=0x0),您正在fgetc使用空指针进行调用.这是导致崩溃的原因.
fp为null,因为fopen调用失败.您需要检查错误.
打开文件失败,因为很可能您没有调用目录~.回想一下,~当您键入命令时,扩展到您的主目录是由shell完成的.fopen只需要真实的文件名.