【发布时间】:2018-05-13 22:28:23
【问题描述】:
我看过以前的帖子,但它们并没有帮助我找到我的问题......为了简短起见,我正在制作一个函数应该逐行读取文本文件(是的,我确实意识到有很多这样的帖子)。但是当我通过 CMD 运行我的程序时,它给了我这个错误:
Program received signal SIGSEGV, Segmentation fault.
__GI___libc_realloc (oldmem=0x10011, bytes=1) at malloc.c:2999
2999 malloc.c: No such file or directory.
我漂亮确定我正确地写出了我的 malloc/realloc 行。我试过找到很多类似的帖子,但所提供的解决方案都没有帮助。如果您有任何我可能错过的帖子建议,请告诉我。无论如何,这是我的功能:
char* read_single_line(FILE* fp){
char* line = NULL;
int num_chars = 0;
char c;
fscanf(fp, "%c", &c);
while(!feof(fp)) {
num_chars++;
line = (char*) realloc(line, num_chars * sizeof(char));
line[num_chars -1] = c;
if (c == '\n') {
break;
}
fscanf(fp, "%c", &c);
}
if(line != NULL) {
line = realloc(line, (num_chars+1) * sizeof(char));
line[num_chars] = '\0';
}
return line;
}
void read_lines(FILE* fp, char*** lines, int* num_lines) {
int i = 0;
int num_lines_in_file = 0;
char line[1000];
if (fp == NULL) {
*lines = NULL;
*num_lines = 0;
} else {
(*lines) = (char**)malloc(1 * sizeof(char*));
while (read_single_line(fp) != NULL) {
(*lines)[i] = (char*)realloc((*lines)[i], sizeof(char));
num_lines_in_file++;
i++;
}
*lines[i] = line;
*num_lines = num_lines_in_file;
}
}
非常感谢任何帮助——我是 C 初学者,请听我说!
【问题讨论】:
-
malloc 中的分段错误通常是先前存储覆盖的结果,而不是因为传递给 malloc 的参数错误。请提供MVCE
-
顺便说一句,你为什么不使用getline 而不是让你的(低效的)
read_single_line? -
通常在使用 gdb 调试崩溃时,查看 back trace 并遍历调用堆栈非常有用。