next up previous contents
Next: 3. キャスト Up: 20. ポインタII Previous: 1. メモリ

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は単項演算子です) 。


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



Noriyo Kanayama 平成14年11月26日