動的なメモリ管理
下記のプログラムで、確保したメモリブロックをどこで開放していいかわかりません。教えてください。お願いします。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define BUFFERSIZE 11
#define MAX_PERSON 10
#define MAX_CHARS 10
int main(void){
char *name[10]; //氏名
int count;
int i;
int l; //文字列の長さ
int top_index = 0;
int bot_index;
char *tmp;
printf("*** 入力された氏名をソートし、表示します ***\n");
printf("*** 最大入力件数10件(1文字目'0'で入力終了) ***\n");
putchar('\n');
for (i = 0; i < MAX_PERSON ; i++) {
printf("氏名入力(10文字まで有効) > ");
name[i] = malloc(sizeof(char) * BUFFERSIZE);
fgets( name[i], BUFFERSIZE, stdin);
l = strlen(name[i]);
if (name[i][l-1] == '\n'){
name[i][l-1] = '\0';
} else {
while ( getchar() != '\n'){
}
}
if (name[i][0] == '0'){
break;
}
printf("累計 : %d\n", i+1);
}
count = i;
//ソート前
/*printf("ソート前\n");
for (i = 0 ;i < count ; i++ ){
printf("%s\n", name[i]);
}
*/
bot_index = count -1;
//シェーカーソート
while (1)
{
int last_swap_index;
// 順方向のスキャン
last_swap_index = top_index;
for ( i = top_index; i < bot_index; i++){
if(strcmp(name[i],name[i+1]) > 0 ){
//ポインタ配列の要素の交換
tmp = name[i];
name[i] = name[i+1];
name[i+1]=tmp;
//実体交換
//tmp = (char*)malloc((strlen(name[i])+1)*sizeof(char));
//strcpy(tmp,name[i]);
//strcpy(name[i],name[i+1]);
//strcpy(name[i+1],tmp);
last_swap_index = i;
}
}
//後方のスキャン範囲を狭める
bot_index = last_swap_index;
if (top_index == bot_index){
break;
}
// 逆方向のスキャン
last_swap_index = bot_index;
for ( i = bot_index; i > top_index; i--){
if(strcmp(name[i],name[i-1]) < 0 ){
//実体交換
//tmp = (char*)malloc((strlen(name[i])+1)*sizeof(char));
//strcpy(tmp,name[i]);
//strcpy(name[i],name[i-1]);
//strcpy(name[i-1],tmp);
//要素の交換
tmp = name[i];
name[i] = name[i-1];
name[i-1]=tmp;
last_swap_index = i;
}
}
//前方のスキャン範囲を狭める
top_index = last_swap_index;
if (top_index == bot_index){
break;
}
}
printf("+++++データ表示+++++\n");
for (i = 0 ;i < count ; i++ ){
printf("%2d : %s\n", i+1, name[i]);
}
return 0;
}