動的メモリ
ポインタと配列はとても、相性がいいといいましたが、 ポインタと配列を1つにして、管理してしまうC言語の関数があります。 それが、「malloc」(エムアロック)というメモリ割付を行う関数です。 「malloc」は「memory allocate」という英語から名づけられていますので、 「メモリを割り当てる」という意味があります。
「malloc」関数の、戻り値はポインタで、引数(入力)は、指定された型や構造体より決まるサイズ(バイト数)です。 関数内では、入力に従った大きさのメモリを確保します。この関数は、ポインタと配列を組み合わせた、とても便利な関数です。 (mallocを使う場合には、ヘッダーファイル「stdlib.h」が必要です。1バイト=8ビット)
「malloc」関数がメモリを確保する状態を、以下のサンプルプログラムで確かめてください。
#include <stdio.h> #include <stdlib.h> int main(void) { int *pointer; /* メモリ用ポインター定義 */ int i; /* メモリの割り付け=整数型・intを10個メモリに確保する */ pointer = (int*)malloc(sizeof(int) * 10); /* これは、同時に整数型配列を確保した事と同じ */ for(i=0; i<10; i++) pointer[i] = i*10; for(i=0; i<10; i++) { printf("メモリの%d番目の値=%d\n", i, *(pointer + i)); } free(pointer); /* メモリの解放 */ return 0; } |
メモリを確保して、不要になったら、「free」という関数で、メモリを解放(無効)にします。 「(int*)malloc」は、この関数の戻り値が、void型のポインタなので、どの型の変数なのかを コンパイラに知らせてやる為に型変換(キャスト)をしています。
型変換とは:型変数の範囲をそろえる意味で行う操作で、メモリ上のデータをどのような型で、 取り出すのかを決めるものです。