dポイントプレゼントキャンペーン実施中!

テキストファイルを読込む関数を作成しています。
まず最初にある程度の領域を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 ***
(省略)
アボートしました

どなたか解決方法を御指導願います。

A 回答 (2件)

memcpy以降でsizeを二倍してください。


いまのままだと、常にsizeの初期値*2のメモリしか確保されませんので、sizeの初期値*2以上読み込もうとするとメモリ破壊が起きてしまいます。
    • good
    • 2
この回答へのお礼

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

お礼日時:2006/01/04 15:02

割り増し量の指定にバグがあるのは#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;
}
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/01/04 15:05

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!