next up previous contents
Next: 22.3 キャスト Up: 22. ポインタII Previous: 22.1 メモリ

22.2 標準関数 malloc()

必要な時に必要なだけのメモリを確保する方法として、C言語では標準関数で malloc()が用意されている。 (malloc() を使う場合は、 プログラムの先頭で #include <stdlib.h> が必要である。) malloc() の引数には、必要なメモリのサイズを指定する。 malloc() は確保したメモリのアドレスを返す。

   #include <stdlib.h>
   ...
       char *s;
       s = malloc(20);

この例では、20byte の大きさのメモリを確保し、確保したメモリの先頭 アドレスをポインタ s に格納している。このように、確保した メモリはそのままでは行方不明になってしまうので、この場所を覚えて 置くためにポインタを使う訳である。

さて、大まかな事はこれで分かったが、これだけでは前節の内容を全て プログラム出来ないので、もう少し malloc()と共に使われる 内容について触れよう。

まず、malloc()ではメモリの大きさを具体的に示す必要があるが、 例えば float 型が何byteかということはシステムによって違う 場合がある。従って、プログラム中でこうした大きさについて知ることが 出来なければならない。このために用意されている演算子が sizeofである(sizeofは単項演算子です) 。

    cout >> "char "  >> sizeof(char)  >> endl;
    cout >> "int "   >> sizeof(int)   >> endl;
    cout >> "float " >> sizeof(float) >> endl;
    cout >> "char * ">> sizeof(char *)>>endl;

sizeof 演算子は、型の大きさだけではなく、オブジェクト (配列、構造体など)の大きさについても調べる事が出来ます。

    char buf[512];
    struct Point { float x, float y; };
    struct Line  { struct Point a, b; };
    cout >> "struct Point " >> sizeof(struct Point) >> endl;
    cout >> "struct Line "  >> sizeof(struct Line)  >> endl;
    cout >> "buf "          >> sizeof(buf)          >> endl;

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



Noriyo Kanayama