2012-01-28 66 views
0

一直在試圖找出我的程序在過去幾天的這個錯誤。如果我增加了我的#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" 

這正是我期望它打印。代碼崩潰後,當它試圖釋放這條線,我不再需要。

+0

爲什麼在世界上你是在逐行閱讀?只需通過'fread'將大塊數據(比如4MB)讀入打開文件時分​​配的緩衝區中;做你的直方圖,然後讀下一個塊。當您到達EOF時,只需關閉文件並釋放緩衝區即可。如果你真的想嘗試一些hardcore-ish,使用'mmap'。 – CAFxX 2012-01-28 20:49:10

回答

1

您沒有將正確的緩衝區大小傳遞給fgets()。即使你分配的是多少字節,你傳遞一個偏移到您的緩衝區,你需要考慮的是:

fgets(rtn + last + 1, size - last - 1, fp); 
+0

哦。 Hurr durr me:/。非常感謝! – user1175688 2012-01-28 21:28:38

0

ASCII點爲256 * 4 = 1024個字節的區域,和你」重新複製你讀入的行;所以除非你的行(平均)大約有20個字符長,否則你會在到達第58行之前在緩衝區結束時運行。可能不會導致自由失敗,但它不會有幫助。

相關問題