【課題5−1 動的にメモリ領域を確保する】

 

<動的に領域を確保する>

配列を宣言すると,型と要素数に応じて必要なメモリー領域が「静的に」確保される.しかしこの方法では宣言した配列以上のデータは扱えないので,大きなデータを扱おうとすると,十分大きなサイズの配列を宣言しておく必要がある.これはメモリーの無駄遣いでもあり,融通の利かない方法である.通常,大きなサイズのメモリ領域や,サイズが始めは未定の領域などは,プログラムの実行中に「動的に」確保し,使い終わったら破棄する,という方法を採る.

すなわち,始めはポインタを宣言しておくだけで,必要な時に必要な大きさのメモリー領域をmalloc関数などを用いて確保する.

 

malloc関数

形式:  #include <stdlib.h>

       void *malloc(size_t size);

機能: 大きさsizeのメモリ領域を確保する

引数: size:確保したいメモリのバイトサイズ.

返値: 成功時は確保したメモリブロックを示すポインタ

       失敗時(指定サイズのメモリが確保できないとき)はNULL

(例)  char *str;

       str = (char *)malloc(100 * sizeof(char));

       if (str==NULL)       // 確保に失敗した場合は...

              return 1;    

       ...

       free(str);

確保された領域の初期化はされず,不定値が入ったままである.    

 

void *

void *は,どんな型のポインタでも指定できる汎用のポインタ.上の例のように,malloc呼び出し時に適切な型のポインタにキャストして使う.

 

<メモリ領域の開放>

mallocで確保した領域は,不要になったらfree関数で解放しなくてはならない.

 

free関数

形式: #include <stdlib.h>

       void free(void *ptr);

機能: 割り当てたメモリブロックの解放.ptrNULLのときは何もしない.

引数: ptr:解放するメモリブロックのポインタ

返値: なし

 

 

戻る