malloc と free について質問です
Posted: 2007年3月27日(火) 16:31
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;
}