我有这个代码,它应该逐个字符地读取文本文件,然后用它做一些事情,但代码在第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
打印任何东西?
答案 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)
,了解更多有关您案例中出现错误的信息。