【发布时间】:2013-04-03 22:00:14
【问题描述】:
我正在编写一个简单的 C 程序,它打开一个文件,并将每一行读入一个数组,其中 LISTS 是我希望读取的文件中的最大行数。
但是,当 MASTER_LIST 的长度小于 LISTS 行时,我第二次在 printf() 上遇到分段错误,但不是第一次(我已评论显示位置)。
我对这种行为有点困惑,我想知道是什么原因造成的,以及我能做些什么来规避它。理想情况下,当 fgets 找到文件末尾时,我会停止阅读。
#define MASTER_LIST "master_list.txt"
#define LINE 64
#define LISTS 32
char **lists = malloc(LISTS * sizeof(char *));
int i;
for (i = 0; i < LISTS; i++) {
lists[i] = malloc(LINE * sizeof(char));
}
/*Open the file for reading.*/
FILE *fp = fopen(MASTER_LIST, "r");
if (fp != NULL) {
/*Each line of the file, up to LISTS is read into lists.*/
for (i = 0; i < LISTS; i++){
lists[i] = fgets(lists[i], LINE, fp);
/*NO SEGFAULT HERE*/ printf("Line Read: %s\n", lists[i]);
}
}
/*print out each line*/
for(i = 0; i < LISTS; i++){
printf("Are we segfaulting yet? %d\n", i);
/*HERE I GET A SEGFAULT*/ printf("%s\n", lists[i]);
printf("How about now? %d\n", i);
}
【问题讨论】:
-
您确定字符串以
'\0'结尾吗? -
我的印象是 fgets 在任何行结束后自动添加空终止符。我确定我的文本文件只有换行符来分隔行。
-
代码没有考虑到
fgets()会失败。当 fgets 失败时,lists[i] 仍然被分配。然后代码尝试打印出一个 NULL 指针 - 虽然不在我期望的地方。 -
@BertholtStutleyJohnson:纯粹出于好奇:您使用的是什么编译器?可能是编译器优化导致输出异常。 (请记住,UB 意味着一切都会发生)。
-
优化标志?你看到
(null)被printf打印出来了吗?
标签: c segmentation-fault