在我的程序中,过去几天一直想弄清楚这个bug。如果我增加#defined LINE_SIZE
的大小,它在我的测试用例上运行正常,但这只是我问题的临时修复。
在这部分代码中,我读取文件中的每一行,并为我找到的每个特定字符增加内存中的一个点。 ascii指向256个int的malloc
'd区域。
void readFile(FILE *fp, int *ascii) {
char *line;
char *temp;
while (!feof(fp)) {
line = readLine(fp);
if (line == NULL)
break;
temp = line;
while (*temp != '\0') {
(*(ascii + *temp))++;
temp++;
}
free(line); <-------------- BREAKS HERE
}
fclose(fp);
}
char* readLine(FILE *fp) {
char *rtn = NULL;
int last = -1;
int size = LINE_SIZE; <------ LINE_SIZE = 8
do {
rtn = (char*)realloc(rtn,size);
if (!rtn) {
printf("Realloc failed\n");
exit(1);
}
fgets(rtn + last + 1, size, fp);
if (feof(fp))
break;
last = strlen(rtn) - 1;
size += size;
if (rtn[last] == '\n')
break;
} while (rtn[last] != '\0');
return rtn;
}
我正在尝试让我的代码读取自己的.c文件,它在250行文件中的第58行中断:void makeList(int *ascii, LinkNode *list) {
在gdb中,在我释放它之前打印line
给了我:
(gdb) print line
$1 = 0x9849578 "void makeList(int *ascii, LinkNode *list) {\n"
这正是我期望它打印的内容。当代码试图释放我不再需要的这条线时,代码就会崩溃。
答案 0 :(得分:1)
您没有将正确的缓冲区大小传递给fgets()
。即使你分配了那么多字节,你也会在缓冲区中传入一个偏移量,你需要考虑到这一点:
fgets(rtn + last + 1, size - last - 1, fp);
答案 1 :(得分:0)
ascii指向256 * 4 = 1024字节的区域,并且您将要读取的行复制到其中;因此,除非您的行(平均)长约20个字符,否则您将在到达第58行之前运行该缓冲区的末尾。可能不会导致自由失败,但它无法帮助。 / p>