一直在試圖找出我的程序在過去幾天的這個錯誤。如果我增加了我的#defined LINE_SIZE
的大小,它對我的測試用例正常工作,但這只是對我的問題的臨時修復。免費():無效的下一個大小(快)在C
在這部分代碼中,我讀取文件中的每一行,併爲每個找到的特定字符在內存中增加一個點。 ascii指向一個256位整數的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"
這正是我期望它打印。代碼崩潰後,當它試圖釋放這條線,我不再需要。
爲什麼在世界上你是在逐行閱讀?只需通過'fread'將大塊數據(比如4MB)讀入打開文件時分配的緩衝區中;做你的直方圖,然後讀下一個塊。當您到達EOF時,只需關閉文件並釋放緩衝區即可。如果你真的想嘗試一些hardcore-ish,使用'mmap'。 – CAFxX 2012-01-28 20:49:10