![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
テキストファイルを読込む関数を作成しています。
まず最初にある程度の領域を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で質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
- C言語・C++・C# leetcode 155 minstack 1 2022/05/07 16:43
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- その他(データベース) 放送大学のデータベースの講義を、興味本位で見ていたら気になることがありました。 講師が、null を 5 2022/04/21 17:06
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# スタックフレームの消滅 6 2023/05/20 12:33
- C言語・C++・C# C++のcase文の書き方 4 2023/02/24 20:50
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
fgetsなどのときのstdinのバッ...
-
DPマッチング
-
C言語のfor文です。 繰り返しの...
-
配列をnビットシフトする
-
double型の値をchar配列に変換...
-
2曲同時再生するにはどうした...
-
'const char *' 型は 'char *' ...
-
switch文で文字を比較すること...
-
char型からのバイト数取得
-
文字列から空白を取り除きたい...
-
間接操作のレベルとは
-
C言語のポインターで詰まっている
-
絶対パスからのファイル名の切...
-
文字列の中のカンマを消したい
-
javaでunsignedは使えないので...
-
charからLPTSTRへの変換方法
-
C言語の入力した文字を反転させ...
-
AnsiPos相当の関数はありません...
-
構造体の各メンバにfor文からア...
-
c++ 文字列を入力して、一文字...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
fgetsなどのときのstdinのバッ...
-
C言語のfor文です。 繰り返しの...
-
文字列から空白を取り除きたい...
-
charからLPTSTRへの変換方法
-
charでの計算?
-
配列をnビットシフトする
-
CStringをwchar_tに変換したい
-
c++ 文字列を入力して、一文字...
-
str系関数を使わずに二つの文字...
-
間接操作のレベルとは
-
int main()の・・・
-
C言語の入力した文字を反転させ...
-
atoi( ) の反対をやりたい
-
switch文で文字を比較すること...
-
テキストデータをそのままバイ...
-
Win32APIでのエディットボック...
-
double型の値をchar配列に変換...
-
干支のプログラム
-
コンパイルエラー invalid ope...
-
間接参照のレベルが異なっています
おすすめ情報