【課題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);
機能: 割り当てたメモリブロックの解放.ptrがNULLのときは何もしない.
引数: ptr:解放するメモリブロックのポインタ
返値: なし