私のプログラムでこの数日間のこのバグを解明しようとしました。 #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"
これはまさに私が印刷すると予想されるものです。直後にコードがクラッシュし、不要になった行を解放しようとしました。
なぜ世界であなたは行単位で読んでいますか?あなたがファイルを開くときに割り当てられたバッファに 'fread'を介して大きなデータ(例えば4MB)を読み込みます。あなたのヒストグラムをして、次のチャンクを読んでください。 EOFに到達したら、ファイルを閉じてバッファーの割り当てを解除してください。本当に何かを試したいなら、 'mmap'を使ってください。 – CAFxX