先日free()関数について質問をしたんですが、free()関数の中身が間違っているという意見と
free()関数の中身についての説明を頂いたのですが、どちらが正しいのか、私には判断が出来ません。正しい意見を教えてください。
前橋和弥著のポインタの完全制覇には一度free(fp)したポイントにアクセスしてはいけないと
ありました。
わたしの参考にしているプログラムに以下のようなfree()関数があるんですが、どうなんでしょうか。
普通openしたファイルを閉じるときにfree()関数でメモリを開放すると認識しているんですが、malloc()関数を使った時もfree()関数でメモリを解放するんでしょうか。
よろしくお願いいたします。
コード コード #include <stdio.h> #include <string.h> #include <stdlib.h> struct list { int key; // キー char name[20]; // 名前 struct list *next; // 次のデータへのポインタ }; struct list *add_list(int key, char *name, struct list *head); void show_list(struct list *p); void free_list(struct list *p); int main(void) { struct list *head; // 先頭ポインタ char name[20]; int key = 0; head = NULL; // 先頭ポインタにNULLを設定 printf("キーと名前(MAX:19文字)を入力(終了:CTRL+Z)\n"); while (scanf("%d %s", &key, name) != EOF) { head = add_list(key, name, head); // リストにデータを登録 } show_list(head); // リストの表示 free_list(head); // リストの開放 return 0; } // リストにデータを登録 struct list *add_list(int key, char *name, struct list *head) { struct list *p; // 記憶領域の確保 if ((p = (struct list *) malloc(sizeof(struct list))) == NULL) { printf("malloc error\n"); exit(EXIT_FAILURE); } // リストにデータを登録 p->key = key; strcpy(p->name, name); // ポインタのつなぎ換え p->next = head; // 今までの先頭ポインタを次ポインタに // 新しいデータの次のポインタに headのアドレスをつなぐ。 // p->nextが次を指すようにする。新たな領域を先頭ポインタに head = p; // 新たな領域を先頭ポインタに // headにpのアドレスを代入してpを先頭ポインタにする。 // 先頭ポインタ(head)新しくなったNODEに沿って移動していく return head; // 最後に代入されたデータがheadになるのでそのアドレスを返す。 } // リストの表示 void show_list(struct list *p) { while (p != NULL) { // 次ポインタがNULLまで処理 printf("%3d %s\n", p->key, p->name); p = p->next; } } //リストの開放 void free_list(struct list *p) { struct list *p2; while (p != NULL) { // 次ポインタがNULLまで処理 p2 = p->next; free(p); p = p2; } }
一つ前のQ&Aを指しているなら「free()関数の中身が間違っているという意見」は見当たりません。何かの勘違い?質問者さんの言い間違い?それとも一つ前のQ&Aではない?自分はこの質問を見て混乱してしまいました。
回答3件
あなたの回答
tips
プレビュー