
テキストファイルを読込む関数を作成しています。
まず最初にある程度の領域を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 ***
(省略)
アボートしました
どなたか解決方法を御指導願います。
No.1ベストアンサー
- 回答日時:
memcpy以降でsizeを二倍してください。
いまのままだと、常にsizeの初期値*2のメモリしか確保されませんので、sizeの初期値*2以上読み込もうとするとメモリ破壊が起きてしまいます。
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;
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
iconv_open失敗
-
2曲同時再生するにはどうした...
-
fgetsなどのときのstdinのバッ...
-
干支のプログラム
-
テキストデータをそのままバイ...
-
間接参照のレベルが異なっています
-
文字列から空白を取り除きたい...
-
構造体の各メンバにfor文からア...
-
fgetsについて
-
'const char *' 型は 'char *' ...
-
c++ 文字列を入力して、一文字...
-
文字列がNULLか空文字列かの判定
-
atoi( ) の反対をやりたい
-
プログラム
-
【C言語】構造体内の領域解放(...
-
C言語の入力した文字を反転させ...
-
スタックポインタを使って,1...
-
charからLPTSTRへの変換方法
-
CStringをwchar_tに変換したい
-
C言語、このコードを実行したい...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
構造体の各メンバにfor文からア...
-
fgetsなどのときのstdinのバッ...
-
文字列から空白を取り除きたい...
-
C言語のfor文です。 繰り返しの...
-
CStringをwchar_tに変換したい
-
間接参照のレベルが異なっています
-
c++ 文字列を入力して、一文字...
-
C言語の入力した文字を反転させ...
-
charからLPTSTRへの変換方法
-
ネットワークにつながっている...
-
'const char *' 型は 'char *' ...
-
テキストデータをそのままバイ...
-
c言語でユーザ関数を利用して入...
-
atoi( ) の反対をやりたい
-
間接操作のレベルとは
-
-'0'の意味について
-
double型の値をchar配列に変換...
-
Linuxでフォルダ内全ファイル名...
-
配列をnビットシフトする
-
型変換
おすすめ情報