1 - 横浜国立大学

Download Report

Transcript 1 - 横浜国立大学

アルゴリズムとデータ構造
補足資料12-1
「mallocとfree」 (簡易版)
横浜国立大学
理工学部
数物・電子情報系学科
富井尚志
struct list {
int key;
struct list *next;
};
key
next
21
NULL
の「ひな形」(型)
struct list {
int key;
next は、struct list型へのポインタ
struct list *next; next が指し示す先の要素はstruct list型
つまりこういうこと。
};
key
next
21
key
next
22
NULL
1.メモリに割当てる
p = (struct list *)malloc(sizeof(struct list));
2.その量は、”struct list”型1個分
3.mallocの戻り値は、割当てたメモリの先頭アドレス
4.そのアドレス(参照先)の中身は “struct list”型として、「キャスト」(型変換)
5.“struct list”型へのポインタとして、アドレスを代入
この書き方は、憶えましょう。
結果は
↓これ(1個割当て)
p
key
next
21
NULL
要するに、
新しく「箱」ができる。
この箱に名前(変数名)はない。
だから、ポインタ変数pで指し示しておく必要がある。
free(p);
malloc関数で割り当てられた
この名前のない「箱」の領域は、
開放する(使わなかったことにする)ことができる。
この書き方は、憶えましょう。
結果は
↓これ
p
赤い箱は解放された。
つまり、このメモリは、別のプログラムや別の機会に使われる。
でも、ポインタ変数pにアドレスだけは残っている。
うっかりpの参照先に代入しようとすると、OSが怒る。(Segmentation Halt)
p->key
は、int型の値をもつ
p->next->key
p
key
21
next
p->next
は、struct list型へのポインタを値としてもつ
key
next
22
NULL
p->next->next