• ベストアンサー

メモリの再確保について

テキストファイルを読込む関数を作成しています。 まず最初にある程度の領域をmalloc()関数で確保し、 読み込む過程で領域が不足すると再割り当てを 行うようにしたいのですが、 エラーが出力されます。 ソース(エラー処理は省略)は次の通りです。 textdata = (char *) malloc (size * sizeof (char)); for (i = 0; !feof (stream); ) { character = fgetc (stream); textdata[i] = character; i++; if ((i % size) == 0) { temp = (char *) malloc (2 * size * sizeof (char)); memcpy (temp, textdata, size * sizeof (char)); free (textdata); textdata = temp; } } 出力されるエラーは次の通りです。 *** glibc detected *** ./lsm: malloc(): memory corruption (fast): 0x09a34198 *** (省略) アボートしました どなたか解決方法を御指導願います。

質問者が選んだベストアンサー

  • ベストアンサー
  • jgk
  • ベストアンサー率75% (104/138)
回答No.1

memcpy以降でsizeを二倍してください。 いまのままだと、常にsizeの初期値*2のメモリしか確保されませんので、sizeの初期値*2以上読み込もうとするとメモリ破壊が起きてしまいます。

noname#18852
質問者

お礼

ありがとうございます。 おっしゃる通りです。 うかつでした(^_^ )>

その他の回答 (1)

  • mac_res
  • ベストアンサー率36% (568/1571)
回答No.2

割り増し量の指定にバグがあるのは#1の方のおっしゃるとおりです。malloc(3)されたメモリーの割り増しにはrealloc(3)を使うと便利です。 -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- #include <stdio.h> #include <errno.h> #include <malloc.h> char *prog; int main(int argc, char *argv[]) { FILE *fin; char *buf; int c; size_t n, size = 8; prog = argv[0]; if (argc < 2) { fprintf(stderr, "Usage: %s filename\n", prog); return(EINVAL); } if((fin = fopen(argv[1], "r")) == NULL) { fprintf(stderr,"Can't open %s\n", argv[1]); return(errno); } if ((buf = malloc(size)) == NULL) { fprintf(stderr,"Can't alloc memory\n"); return(errno); } while ((c = fgetc(fin)) != EOF) { if (n > size) { size *= 2; if ((buf = realloc(buf, size)) == NULL) { fprintf(stderr,"Can't alloc memory\n"); return(errno); } } buf[n++] = c; } printf("%s", buf); return 0; }

noname#18852
質問者

お礼

ありがとうございます。 realloc()関数の存在意義も mac_resさんの例示で 理解できました。