malloc と free について質問です

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

malloc と free について質問です

#1

投稿記事 by そら » 18年前

malloc と free について質問です。

作成しているプログラムで、場合によってはデータ数が跳ね上がるので
データ数を可変にしたいと考えています。

そこで、意味も分からず malloc と free を使ったところ、
割当には成功するものの解放が出来ません。

気になるところ
 ※1、※2の部分

どこがいけないのでしょうか?
とりあえずコンパイルが通ったのでOKとしてますが、根本的にダメかも知れません。


以下、ソース。
とりあえず、実験なのでコンソールアプリです。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>

//======================================
// 構造体定義
//======================================
typedef struct {
	int		id;
} INFO_T;

typedef struct {
	int		use;
	INFO_T  *info;
} LIST_T;

//======================================
// メモリ割当
//======================================
int add_data( INFO_T **info )
{
	*info = (INFO_T *)malloc( sizeof(INFO_T) );
	
	if( *info == NULL ){
		return 0;
	}

	// .id でも ->id でもダメ <-- ※2
	// id = 1 にしたい
	printf("%08x\n", *info);

	return 1;
}

//======================================
// メモリ解放
//======================================
int del_data( INFO_T **info )
{
	free((char *)*info);
	
	return 1;
}

//======================================
// メイン
//======================================
int main(int argc, char* argv[/url])
{
	int     i, n;
	char	c[128];

	LIST_T	data[20];
	
	memset(&data, 0, sizeof(data));
	srand((unsigned)time(NULL));
	
	// 初期状態
	printf("=== 初期状態 ===\n");
	for(i=0;i<20;i++){
		printf("%2d: %08x\n", i, data.info);
	}
	
	printf("=== メモリ割当中 ===\n");
	for(i=0;i<5;i++){
		n = rand()%20;
		if( data[n].use == 0 ){
			if( add_data( &data[n].info ) != 0 ){
				data[n].use = 1;
				data[n].info->id = 1;
				printf("%08x(id=%d)\n", data[n].info, data[n].info->id);
			}
		}else{
			data[n].info->id++;
			printf("%08x(id=%d)\n", data[n].info, data[n].info->id);
		}
	}
	
	// メモリ割り当て済み
	printf("=== メモリ割当済 ===\n");
	for(i=0;i<20;i++){
		printf("%2d: %08x\n", i, data.info);
		// メモリの解放
		del_data( &data.info );
	}
	
	// 初期状態のハズ? <-- ※1
	printf("=== メモリ解放後 ===\n");
	for(i=0;i<20;i++){
		printf("%2d: %08x\n", i, data.info);
	}
	
	printf("終了します@Input Any Keys...");
	scanf("%s", c);

	return 0;
}

Blue

Re:malloc と free について質問です

#2

投稿記事 by Blue » 18年前

freeって、自動的にNULLを入れるような機能はないはず。
(そうならfreeの引数はポインタのポインタになっていないと)

※2は何をしたいのかよくわからないです。

なぎ

Re:malloc と free について質問です

#3

投稿記事 by なぎ » 18年前

まず、free() しても動的に確保したメモリの中身は、(恐ろしいことに)しばらく、何の変化もありません。
ですから、何かを見て、free() したかどうかを知ることはできません。

あと、※2のところは、

(*info)->id = 1;

ですね。

そら

Re:malloc と free について質問です

#4

投稿記事 by そら » 18年前

http://www.st.rim.or.jp/~phinloda/cqa/cqa4.html
Q 【freeした直後の領域】


確かに、NULLにはならないようですね・・・。
使ったことない関数なので、知りませんでした。

そこで、

int del_data( INFO_T **info )
{
	INFO_T *next = NULL;
	
	free((char *)*info);
	
	*info = next;
	
	return 1;
}

とすれば、※1 の部分は初期状態と一致しました。

・・・が、自分で NULL を入れているのでそれは当たり前。
本当に解放されているのでしょうか?

malloc, free なんて使ったことが無いので、さっぱり分かりません。


構造体配列が0~21735個で、平均で40個ぐらいなので、最大分を固定で取ると、
このデータだけで数百キロバイトになってしまうので、動的にしようと思った次第です。


※2は、
	info->id = 1;
	info.id = 1;
	*info->id = 1;
	*info.id = 1;
	**info->id = 1;
	**info.id = 1;
全部コンパイルが通らないが、一体どうすれば入るのだろうって話です。

そら

Re:malloc と free について質問です

#5

投稿記事 by そら » 18年前

※2について

確認しました。

言われてみれば、* は最後に解決されますね。

運良く(?)コンパイル通らなかったから気付けたけど、
コンパイル通ってたら絶対気付かねー。

閉鎖

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