2012-01-28 9 views
0

私のプログラムでこの数日間のこのバグを解明しようとしました。 #defined LINE_SIZEのサイズを増やすとテストケースが正常に動作しますが、それは私の問題の一時的な修正に過ぎません。free():Cの無効な次のサイズ(高速)

コードのこの部分では、ファイルのすべての行を読み込み、見つかった特定の文字ごとにメモリ内の点をインクリメントします。 asciiは、256のintのmallocの領域を指しています。私は自分のコードを持ってしようとしている

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に壊す:私はそれが与える解放直前にlineを印刷し、GDBでvoid makeList(int *ascii, LinkNode *list) {

私:

(gdb) print line 
$1 = 0x9849578 "void makeList(int *ascii, LinkNode *list) {\n" 

これはまさに私が印刷すると予想されるものです。直後にコードがクラッシュし、不要になった行を解放しようとしました。

+0

なぜ世界であなたは行単位で読んでいますか?あなたがファイルを開くときに割り当てられたバッファに 'fread'を介して大きなデータ(例えば4MB)を読み込みます。あなたのヒストグラムをして、次のチャンクを読んでください。 EOFに到達したら、ファイルを閉じてバッファーの割り当てを解除してください。本当に何かを試したいなら、 'mmap'を使ってください。 – CAFxX

答えて

1

正しいバッファサイズをfgets()に渡していません。 「あなた

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

ああ。 Hurr durr me:/。どうもありがとう! – user1175688

0

アスキー・ポイントを256 * 4 = 1024バイトの領域に、そして:でも、あなたはそのバイト数を割り当てているのに、あなたはあなたのバッファへのオフセットに渡しているとあなたはそれを考慮する必要があり読み込んだ行をコピーし直してください。あなたの行が(平均して)約20文字でなければ、行の58に達する前にそのバッファの最後を逃げようとします。自由に失敗することはないかもしれませんが、助けになることはできません。

関連する問題