分段错误遍历文本文件

时间:2017-08-21 22:57:41

标签: 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;
}

奇怪的是肯定会发生,因为它甚至不会将"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.

我也在valgrind --leak-check=full ./test中使用valgrind运行它,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

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

2 个答案:

答案 0 :(得分:5)

正如调试器所说(fgetc),您使用空指针调用fp。这就是导致崩溃的原因。

fopen为空,因为~调用失败。你需要检查错误。

打开文件失败,因为很可能您没有名为~的目录。回想一下,当您键入命令时,shell会将fopen扩展到您的主目录。 asp:Image只接受真实的文件名。

答案 1 :(得分:1)

您忘记检查for的返回值是否为NULL,这表示尝试打开文件时出错。

你的errno循环忙于使用NULL指针,因此你会遇到段错误。

检查全局变量test_datagen = ImageDataGenerator(rescale=1./255) test_generator = test_datagen.flow_from_directory( test_dir, target_size=(200, 200), color_mode="rgb", shuffle = "false", class_mode='categorical') filenames = test_generator.filenames nb_samples = len(filenames) predict = model.predict_generator(test_generator,nb_samples) ,了解更多有关您案例中出现错误的信息。