質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

3回答

3773閲覧

free()関数について、こんがらがっています。正しい意見を教えてください。

退会済みユーザー

退会済みユーザー

総合スコア0

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2018/01/20 07:18

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KSwordOfHaste

2018/01/20 07:43

一つ前のQ&Aを指しているなら「free()関数の中身が間違っているという意見」は見当たりません。何かの勘違い?質問者さんの言い間違い?それとも一つ前のQ&Aではない?自分はこの質問を見て混乱してしまいました。
guest

回答3

0

ベストアンサー

while (p != NULL) { // 次ポインタがNULLまで処理 p2 = p->next; // freeの前にnextが指す場所をとっといて free(p); // (pをfreeするとp->nextが読めない。アブナイトコダッター) p = p2; // んでもって無事次の要素を辿ることができるね♪ }

普通openしたファイルを閉じるときにfree()関数でメモリを開放すると認識している

ファイルはfopenで開けてfcloseで閉じる。
メモリはmallocで獲得しfreeで開放する。

投稿2018/01/20 07:29

編集2018/01/20 07:29
episteme

総合スコア16614

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/01/20 07:38

ありがとうございます。いつも恥しい質問で恐縮しています。
guest

0

普通openしたファイルを閉じるときにfree()関数でメモリを開放すると認識している

違う。

free()関数はmalloc(),calloc(),realloc(),aligned_alloc()によって確保されたメモリーを開放するために用います

投稿2018/01/20 07:40

yumetodo

総合スコア5850

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/01/20 07:42

いつもありがとうございます。皆さんに指摘して頂きたすかりました。
guest

0

open()で開いたファイルを閉じるのは**close()です。
malloc()で確保したメモリを解放するのは
free()**です。

投稿2018/01/20 07:33

TaroToyotomi

総合スコア1430

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/01/20 07:35

ありがとうございます。そうでした勘違いしていました。 初心者なのでご勘弁を。
TaroToyotomi

2018/01/20 07:37

いえいえ、少なからずお役に立てたのならよかったです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問