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; }