freeできない!

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
つちのこ

freeできない!

#1

投稿記事 by つちのこ » 13年前

2回目の質問申し訳ございません。
今回質問したのはfreeするとヒープが破壊されてしまい何故破壊されてしまうのか分からず質問しました。

char型のポインタをmallocし、freeしたのですが、なぜかfreeできません。
どこが原因なのでしょうか?

コード:

#include "GLOVAL.h"

#define DATA  2;//データ数
#define BUF  45;//一行目のデータ


static struct DATABASE DataBase[DATA];//データベース

//データベース
void DataBase(){

	FILE *fp;		//csvファイル

	char buff[BUF];	        //空読み用
	int i=-1;			//ID
	char csvFile[100];	//fgetsするため
	char *Data1, *Data2, *Data3, *Data4, *Data5, *Data6;//数値に変換するのに使う


	Data1 = (char *)malloc( sizeof( char ) );
	Data2 = (char *)malloc( sizeof( char ) );
	Data3 = (char *)malloc( sizeof( char ) );
	Data4 = (char *)malloc( sizeof( char ) );
	Data5 = (char *)malloc( sizeof( char ) );
	Data6 = (char *)malloc( sizeof( char ) );
	

	//----ファイルオープン----
	fp = fopen( "DataBase.csv", "r" );

	fgets( buff, sizeof( buff ), fp );//空読み
	
	//ファイル読み込み
	while( ( fgets( csvFile, sizeof( csvFile ), fp )) != NULL ){

		i++;//ID

		sscanf( Data_csv, "%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,]", DataBase[i].name,
			Data1, Data2, Data3, Data4,
			Data5, Data6 );

		//変換
		DataBase[i].Data1 = atof( Data1 );
		DataBase[i].Data2 = atof( Data2 );
		DataBase[i].Data3 = atof( Data3 );
		DataBase[i].Data4 = atof( Data4 );
		DataBase[i].Data5 = atof( Data5 );
		DataBase[i].Data6 = atof( Data6 );
	}	
	
	//-----ファイルクローズ------
	fclose( fp );

//ここでヒープが破壊される
	free( Data1 );
	free( Data2 );
	free( Data3 );
	free( Data4 );
	free( Data5 );
	free( Data6 );

}
これで実行するとfreeの箇所でヒープが破壊されてしまいます。
何度もデバッグしてみたところ、whileの中でfreeしても破壊されず、whileの外だと破壊されてしまいます。
なので、whileのどれかと思い、弄ってみると sscanfが原因だとわかりました。(sscanfの箇所をコメントにするとfreeできる)
しかし、このsscanfなぜ原因なのかがわかりません。
どこを直せば解決するでしょうか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: freeできない!

#2

投稿記事 by softya(ソフト屋) » 13年前

free()で破壊するのではなくヒープが壊れている事が発覚しているだけですね。
原因は、(char *)malloc( sizeof( char ) );で1バイトしか確保していない領域にもっとバイト数が必要な文字列を書き込んでしまっていることです。
文字列に必要なだけのサイズを確保して下さい。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

つちのこ

Re: freeできない!

#3

投稿記事 by つちのこ » 13年前

softya様ご返信ありがとうございます。

こんな簡単なミスをしていたとは・・・。無事解決することができました。
視点が、sscanf、freeだけにいってしまってました。
今後こんなミスが無いよう色々な視点から間違いを見つけたいと思います。

夜遅くにご返信ありがとうございます。

閉鎖

“C言語何でも質問掲示板” へ戻る