dポイントプレゼントキャンペーン実施中!

struct list *p;

/* 記憶領域の確保 */
if ((p = (struct list *) malloc(sizeof(struct list))) == NULL) {
printf("malloc error\n");
exit(1);
}
とサンプルプログラムがあるのですが、if分の意味がわかりません。
また、mallocを使った場合freeで開放とあるのですが、
どういう意味なのかわかりません。
よろしければ、上記2つの点について教えてください。

A 回答 (5件)

>freeはつまり何かにたとえると、


サーカスなどで動物が必要なため動物を使い、
使い終わったら、ジャングルなどに放すための
関数ということですか?

そのように考えて、かまいません。但し、動物を使うためには、どこからか、借りてこなければ、いけませんので、動物協会から、借りてきて、使い終わったら、動物協会に返すと考えて下さい。

>さらに質問なんですが、なぜ、使い終わりましたと教えるのですか?
使い終わりましたと教える=動物を返すことになります。動物を返してあげないと、他のサーカス団が、動物をかりにきたとき、動物がいなくなるので貸すことが出来なくなります。
mallocで失敗するとNULLが返りますが、これはもう、貸し出せるメモリがありませんということです。動物を何匹か、貸して下さいと依頼がきても、動物がその数分いないので、貸し出せない状態と同じです。ですから、かりたら、使用後、すぐに返してあげないと、他のひとが、借りれなくなるので、返すようにして下さい。
    • good
    • 0

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);
}
    • good
    • 0

free関数は、malloc、calloc、およびreallocのいずれかで割り付けた領域を解放するために使用します。

解放された領域は、malloc、calloc、またはreallocのいずれかで再利用することができるようになります。

注意しないといけないのは、free関数で領域を解放したとしても、実際にメインメモリの空きが増えるかどうか(つまりメモリがOSに返されるかどうか)は、規格上は規定されていません。ですから、そのプログラムの中では再利用できますが、並列に動いている他のプログラム(プロセス)で再利用できるとは限らないわけです。
    • good
    • 0

#1さんではありませんがお答えします。



まず1行目の解説。
malloc は動的にメモリを確保する関数です。
malloc のパラメータは確保するメモリのサイズです。
つまり1行目の sizeof( struct list ) は、構造体 list のサイズ分ということになります。
malloc の戻り値は void* です。
これを構造体 list の領域として割り当てるために、struct list * 型にキャストをして p に格納しています。
if文は malloc が正常にできたかのチェックです。

さてfreeですが、確保したメモリは必ず解放しなければいけません。
そうしないと使うたびにメモリが減っていってしまいますからね。
これをメモリリークといいます。
http://e-words.jp/w/E383A1E383A2E383AAE383AAE383 …
子供のころから言われてると思いますが、「使ったものは片付けなさい」ということですね。
そうしないと部屋(メモリ)の中がどんどん狭くなってしまいます。

ちなみに開放ではなくて解放です。
    • good
    • 0

malloc()はメモリ領域を確保する関数です。

領域確保に失敗した場合、NULLを返します。
if文はmalloc()が失敗したかをチェックしています。

free()は確保したメモリを開放する関数です。malloc()で確保した領域をOSに使い終わりましたと教えるイメージでしょうか。

この回答への補足

freeはつまり何かにたとえると、
サーカスなどで動物が必要なため動物を使い、
使い終わったら、ジャングルなどに放すための
関数ということですか?
さらに質問なんですが、なぜ、使い終わりましたと教えるのですか?

補足日時:2005/09/09 10:10
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!