動的メモリ
メモリ領域を動的に確保する
通常、変数で割り当てるメモリサイズは静的でした
文字列を格納するのにも、変数の宣言時にそのサイズを指定してきましたね
しかし、これではハードウェアの性能をフルに生かすことができません
文字型の配列を1000バイト確保していても、プログラムの中で10バイトしか使わなければ
990バイトの領域が無駄な資源になってしまいます
当然、逆にメモリの割り当てが少ないために再コンパイルするはめになるのもバカらしいですね
そこで動的にメモリを割り当てるということが要求されます
動的にメモリを割り当てるというのは、プログラムの実行中に動的に確保する領域を変化させるということです
これができれば、必要に応じたメモリを割り当てることができます
動的なメモリの割り当てにはmalloc()関数を使用します
この関数は指定したサイズの領域を確保して void 型のポインタを返します
void *malloc( size_t サイズ );
サイズに割り当てるサイズをバイト単位で指定します
malloc()は、指定されたサイズの領域を確保したスペースへのポインタを返します
通常は、このvoid型のポインタをキャストして受け取ります
ただし、メモリ領域が足りない場合はNULLを返します
malloc()から受け取ったポインタはNULLかどうかを調べてから使用するのが一般的です
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
char *po;
po = (char *)malloc(sizeof(char) * 128);
if (po == NULL) exit(1);
strcpy(po , "Kitty on your lap");
printf("%s" , po);
return 0;
}
因みに、malloc(sizeof(char) * 128); という部分は
char型は1バイトしか確保しないので malloc(128); としても基本的に同じです
ただし、各型で確保するメモリサイズは環境やプラットフォームで異なります
そのため、どのような型であれCプログラマの多くはsizeof演算子を使って方のサイズを得
それに割り当てるサイズを乗算する形をとります
さて、通常は割り当てたメモリはプログラムの終了時に解放されます
しかし、当然長いプログラムなどではプログラマが情況によって任意に解放しなければならない場合もあるでしょう
そうでないとしても、割り当てたメモリは必ず解放します
割り当てたメモリを解放するにはfree()関数を使用します
void free( void *メモリ );
メモリには以前割り当てたメモリブロックを指定します
必ず有効な(mallocなどで割り当てた)ポインタを指定してください
<#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
char *po;
po = (char *)malloc(sizeof(char) * 128);
if (po == NULL) exit(1);
strcpy(po , "Kitty on your lap");
printf("%s" , po);
free(po);
return 0;
}
これで、コンパイル時ではなくプログラムの状況によってメモリを割り当てることができます
メモリの割り当ては、他にもcalloc()関数というものがあります
この関数は、各要素のバイト数も同時に指定することができます
void *calloc( size_t 要素数, size_t 要素サイズ );
要素数には、割り当てるメモリブロックの要素数を指定します
これは、mallocと同じです
要素サイズには、各要素のバイトサイズを指定することができます
戻り値もmalloc同様に、割り当てたスペースのポインタです
先ほどのプログラムをcalloc()で書きなおすと次のようになります
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
char *po;
po = (char *)calloc(128 , sizeof(char));
if (po == NULL) exit(1);
strcpy(po , "Kitty on your lap");
printf("%s" , po);
free(po);
return 0;
}
void *malloc( size_t size );
メモリブロックを割り当てます
ヘッダ - stdlib.h , malloc.h
size - 割り当てるバイト数を指定します
戻り値 - 割り当てたメモリブロックのポインタ
void *calloc( size_t num, size_t size );
要素を初期化した状態で、メモリブロックを割り当てます
ヘッダ - stdlib.h , malloc.h
num - 割り当てるよう素数を指定します
size - 各要素のサイズをバイト単位で指定します
戻り値 - 割り当てたメモリブロックのポインタ
void free( void *memblock );
割り当てたメモリブロックを解放します
ヘッダ - stdlib.h , malloc.h
nenblock - 以前mallocなどで割り当てたメモリブロックのポインタ