動的メモリ確保


さて、これで、各種データ構造を定義できるようになったはず。 で、現在のところ、 でも、中にはどれぐらい必要になるか実行してみるまで分からないし、 どのくらいの期間必要になるかも分からないといった時もあるでしょう。 そんな場合は、 ことになります。 で、 プログラム実行の際のメモリ領域は、大域変数やプログラム実体がおかれるデータセグメント領域と、 局所変数を含めてスタックがおかれる領域と、動的にメモリを確保するヒープ領域の 3 領域に別れている というわけです。イメージでいうとこんな感じ?(multithread とかだと、stack は複数になる)

さきほどつくったstruct ListAの場合です。 ListA をつくるための関数 ListA_tp new_ListA() をつくります。 malloc は、heap からしていされたサイズの領域を切り取ってくるので、

ListA_tp new_ListA() {
    ListA_tp result = (ListA_tp)malloc(sizeof(ListA_t));
    if(result == NULL) {
	printf("Memory Exhausted!!\n");
	exit(1);
    }
    return result;
}
これで終りです。malloc()は必要なサイズを要求すれば、その分のメモリを確保して、 void*として返してくれます。 ですから、利用する型(ListA_tp)型変換(cast)して、 利用しましょう。

逆に、返す場合は、free してやることになります。これで、malloc/free などを提供している メモリ管理機構(Memory Management System)は、この領域を再利用してくれることでしょう。

void free_ListA(ListA_tp target){
    free((void*)target);		 
}
もうちょっと凝ったことをしたいという人は、こちら

2001.11.20/ Tomio KAMADA: kamada@cs.kobe-u.ac.jp