- 締切済み
動的なメモリ管理(複数の使用済みのメモリブロックの解放)
氏名をmalloc()した配列に格納後,氏名アドレスと生年月日を組み合わせた構造体をさらにmallocし,そのアドレスをポインタ配列に登録していく。生年月日は,YYYYMMDD形式でキーボード入力されたデータを数値変換してlong型の構造体メンバーに格納する。 下記のプログラムでどこで使用済みのメモリブロックを解放すればよいか教えてください。お願いします。 #include <stdio.h> #include <string.h> #include <stdlib.h> #define DEBUG 0 /* debug mode 0:off 1:on */ #define BUFFERSIZE 11 #define MAX_PERSON 10 #define MAX_CHARS 10 #define BBUFFERSIZE 8 // YYYYMMDD typedef struct { char *name; //氏名 long birth; // 生年月日 YYYYMMDD }PERSON; int main(void){ char str[BUFFERSIZE]; /*氏名一時保存の配列,*/ char *st; //氏名保存配列 PERSON *person[MAX_PERSON]; /*構造体のアドレスを保存する配列*/ PERSON per[MAX_PERSON];//構造体保存配列 char bir[BBUFFERSIZE]; int count; int i; int j; int l; //文字列の長さ int top_index = 0; int bot_index; int day; int mon; int num ; int ch; char *tmp; printf("*** 入力された氏名をソートし、表示します ***\n"); printf("*** 最大入力件数10件(1文字目'0'で入力終了) ***\n"); putchar('\n'); for (i = 0; i < MAX_PERSON ; i++) { printf("氏名入力(10文字まで有効) > "); //氏名をmalloc()した配列に格納 fgets(str, BUFFERSIZE, stdin); l = strlen(str); if (str[l-1] == '\n'){ str[l-1] = '\0'; } else { while ( getchar() != '\n'){ } } if (str[0] == '0'){ break; } st = (char*)malloc(sizeof(char) * (strlen(str)+1)); strcpy(st,str);//\0も含まれてコピー printf("累計 : %d\n", i+1); //氏名アドレスと生年月日を組み合わせた構造体をmalloc() //そのアドレスをポインタ配列に登録 per[i].name = st; //生年月日入力 printf( "生年月日入力(YYYYMMDD) > " ); while(1){ l = 0; while ((ch = getchar()) != '\n' && ch != EOF) { if (l < 8) { bir[l] = ch; } l++; } num = 0; //数値に変換してlong型の構造体のメンバに保存 for ( j = 0; j < 8; j++){ num = num * 10 + (bir[j] - '0'); } printf("num : %d\n",num); per[i].birth = num; break; } person[i] = (PERSON*)malloc(sizeof(per[i])); person[i] = &per[i]; } count = i; printf("データ表示\n"); for (i = 0 ;i < count ; i++ ){ printf("%d : %s\n", i+1, person[i]->name); printf("%08d\n", person[i]->birth); } return 0; }
- みんなの回答 (2)
- 専門家の回答