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 ); |