![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
![](http://oshiete.xgoo.jp/images/v2/common/profile/M/noimageicon_setting_14.png?e8efa67)
No.4ベストアンサー
- 回答日時:
>freeはつまり何かにたとえると、
サーカスなどで動物が必要なため動物を使い、
使い終わったら、ジャングルなどに放すための
関数ということですか?
そのように考えて、かまいません。但し、動物を使うためには、どこからか、借りてこなければ、いけませんので、動物協会から、借りてきて、使い終わったら、動物協会に返すと考えて下さい。
>さらに質問なんですが、なぜ、使い終わりましたと教えるのですか?
使い終わりましたと教える=動物を返すことになります。動物を返してあげないと、他のサーカス団が、動物をかりにきたとき、動物がいなくなるので貸すことが出来なくなります。
mallocで失敗するとNULLが返りますが、これはもう、貸し出せるメモリがありませんということです。動物を何匹か、貸して下さいと依頼がきても、動物がその数分いないので、貸し出せない状態と同じです。ですから、かりたら、使用後、すぐに返してあげないと、他のひとが、借りれなくなるので、返すようにして下さい。
No.5
- 回答日時:
mallocとfreeに対する回答は既に出ているので省略。
if文の構文がちょっと複雑なので、そこの説明をしましょう。
if ((p = (struct list *) malloc(sizeof(struct list))) == NULL) {
外の括弧から順次外して説明していきます。
1.ifの次の括弧からNULLの後ろの括弧まで
簡単にするとif(XXX == NULL) {となります。
これはわかりますね?すなわち、XXXがNULL(ヌルポインタ)であれば、後に続くブロックを実行する、ということです。
2.pの手前の括弧から == の手前の括弧まで
この中を簡単にすると(p = (struct list *) YYY)となります。これは代入文です。代入文も代入された値を左辺値として返却します。
すなわち、
p = (struct list *) YYY;
if(p == NULL) {
となっているのと同じ意味だということです。
3.次は括弧ではないですが、p = の次から==の手前二つ目の括弧まで
これを簡単にすると(struct list *) malloc(ZZZ)となります。
前の括弧は型キャストです。malloc関数はvoid *型のメモリポインタを返却します。void *型のメモリはどんな型にも自動的にキャストされるので、実際には明示的にキャストしなくても、ポインタ変数に代入した時点で自動的にキャストされます。多分動作を理解をさせるために明示的にキャストしているのですが、結果的にはかえって複雑になっています。
mallocはメモリのバイト単位のサイズをsize_t型(実際にはint型のことが多い)の整数として渡しますので、ZZZは確保したいメモリサイズを表す整数です。
4.最後にmallocの引数です。(sizeof(struct list))となっています。
struct list型の構造体のサイズを取得しています。
結果として、どういうことになっているのかを日本語で書いてみると
struct list型の構造体のメモリサイズ分のメモリをmalloc関数で確保する。malloc関数から返却されたポインタをstruct list型のポインタ変数pに代入し、さらにヌルポインタ定数NULLと比較する。比較した結果がtrue(p==NULL)であれば、後に続くブロックを実行する。
ちょっと説明がややこしいですが、2で書いたとおりに分割するとちょっとだけ理解がよいと思います。
分割した場合は以下のようになります。
struct list *p;
/* 記憶領域の確保 */
p = (struct list *) malloc(sizeof(struct list));
if (p == NULL) {
printf("malloc error\n");
exit(1);
}
No.3
- 回答日時:
free関数は、malloc、calloc、およびreallocのいずれかで割り付けた領域を解放するために使用します。
解放された領域は、malloc、calloc、またはreallocのいずれかで再利用することができるようになります。注意しないといけないのは、free関数で領域を解放したとしても、実際にメインメモリの空きが増えるかどうか(つまりメモリがOSに返されるかどうか)は、規格上は規定されていません。ですから、そのプログラムの中では再利用できますが、並列に動いている他のプログラム(プロセス)で再利用できるとは限らないわけです。
No.2
- 回答日時:
#1さんではありませんがお答えします。
まず1行目の解説。
malloc は動的にメモリを確保する関数です。
malloc のパラメータは確保するメモリのサイズです。
つまり1行目の sizeof( struct list ) は、構造体 list のサイズ分ということになります。
malloc の戻り値は void* です。
これを構造体 list の領域として割り当てるために、struct list * 型にキャストをして p に格納しています。
if文は malloc が正常にできたかのチェックです。
さてfreeですが、確保したメモリは必ず解放しなければいけません。
そうしないと使うたびにメモリが減っていってしまいますからね。
これをメモリリークといいます。
http://e-words.jp/w/E383A1E383A2E383AAE383AAE383 …
子供のころから言われてると思いますが、「使ったものは片付けなさい」ということですね。
そうしないと部屋(メモリ)の中がどんどん狭くなってしまいます。
ちなみに開放ではなくて解放です。
No.1
- 回答日時:
malloc()はメモリ領域を確保する関数です。
領域確保に失敗した場合、NULLを返します。if文はmalloc()が失敗したかをチェックしています。
free()は確保したメモリを開放する関数です。malloc()で確保した領域をOSに使い終わりましたと教えるイメージでしょうか。
この回答への補足
freeはつまり何かにたとえると、
サーカスなどで動物が必要なため動物を使い、
使い終わったら、ジャングルなどに放すための
関数ということですか?
さらに質問なんですが、なぜ、使い終わりましたと教えるのですか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# leetcode 155 minstack 1 2022/05/07 16:43
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# C言語 leetcode21 Merge Two Sorted Lists 2 2022/04/24 19:35
- PHP PHPでCSVを出力するさいに、ループの中で前の行の値を変更したい 3 2022/10/27 17:44
- Visual Basic(VBA) エクセルのマクロについて教えてください。 3 2023/02/22 08:53
- C言語・C++・C# leetcode21 1 2022/04/21 11:53
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
callocの処理速度
-
mallocについて
-
OpenCV cvLoadImageについて
-
newしないオブジェクトについて
-
Accessで、メモリを開放するタ...
-
ヒープメモリの解放について
-
reallocについて
-
void*型のデータサイズ
-
仮想メモリでない環境でのmallo...
-
グローバル変数のサイズ
-
指定したメモリアドレスの値の...
-
プログラムが途中で強制終了し...
-
fread関数および動的なメモリ確...
-
メモリ不足になってしまう。
-
Win32APIでのメモリ管理について
-
HEAP に関すること
-
【速いブラインドタッチ】手を...
-
VBAにてcolorindexを変数に格納...
-
日付チェック関数について
-
C言語 配列の長さの上限
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
c言語のポインタへの文字列入力...
-
allocってなんですか?
-
newしないオブジェクトについて
-
mallocについて
-
配列の添え字の最大数とは?
-
ヒープメモリの解放について
-
ビットをローテートするプログ...
-
C++で、メンバもヒープに確保さ...
-
malloc呼び出し時のセグメンテ...
-
プログラムが途中で強制終了し...
-
指定したメモリアドレスの値の...
-
スタック破壊の上手な見つけ方...
-
void*型のデータサイズ
-
ポインタのポインタの初期化法
-
free関数で動作が止まる
-
callocの処理速度
-
MSDNがgethostbynameではなくge...
-
C++のnewで確保したメモリーの...
-
sprintf()の使い方について
-
Accessで、メモリを開放するタ...
おすすめ情報