malloc()が用意されている。
(malloc() を使う場合は、
プログラムの先頭で #include <stdlib.h> が必要である。)
malloc() の引数には、必要なメモリのサイズを指定する。
malloc() は確保したメモリのアドレスを返す。
#include <stdlib.h>
...
char *s;
s = malloc(20);
|
この例では、20byte の大きさのメモリを確保し、確保したメモリの先頭
アドレスをポインタ s に格納している。このように、確保した
メモリはそのままでは行方不明になってしまうので、この場所を覚えて
置くためにポインタを使う訳である。
さて、大まかな事はこれで分かったが、これだけでは前節の内容を全て
プログラム出来ないので、もう少し malloc()と共に使われる
内容について触れよう。
まず、malloc()ではメモリの大きさを具体的に示す必要があるが、
例えば float 型が何byteかということはシステムによって違う
場合がある。従って、プログラム中でこうした大きさについて知ることが
出来なければならない。このために用意されている演算子が
sizeofである(sizeofは単項演算子です) 。
printf("char %d\n", sizeof(char));
printf("int %d\n", sizeof(int));
printf("float %d\n", sizeof(float));
printf("char * %d\n", sizeof(char *));
|
sizeof 演算子は、型の大きさだけではなく、オブジェクト
(配列、構造体など)の大きさについても調べる事が出来ます。
char buf[512];
struct Point { float x, float y; };
struct Line { struct Point a, b; };
printf("struct Point %d\n", sizeof(struct Point));
printf("struct Line %d\n", sizeof(struct Line));
printf("buf %d\n", sizeof(buf));
|
sizeofは単項演算子ですが、優先順位などの関係で式に利用した
時の問題が出ないように、習慣的に ( ) で囲って置きます。
この sizeof を使うと、使用しているOSなどに依存しないプログラム
が書けるとともに、構造体などのメモリに占めるサイズが不明な型の大きさ
も取得出来る訳です。従って、malloc()と共に用いる場合は通常
次のように使います。
/* char 20個のメモリ */
char * s;
s = malloc( sizeof(char) * 20 );
|
/* sturct Point 10 個分のメモリ */
struct Point { float x, y; };
struct Point *p;
p = malloc( sizeof(struct Point) * 10 );
|