配列の大きさは変数によって動的に変えられる。

「ISO/IEC 9899 : 1999 – Programming Language C」(略称C99)という新しい規格のC言語では、配列の宣言が、そのサイズを変数で指定できるようになった。いわゆる、可変長配列 (Variable-size array) が使える。

たとえば、以下の関数は巨大な10進数を2進数に変換するものだが、一時的に加算の中間結果を保存するため、配列 tmp[] が必要。しかし、関数が呼び出されるまでは配列のサイズが判らないので、いままでのCなら malloc関数等を利用してメモリを確保しないといけなかったが、可変長配列を使えば、すっきりした書き方ができる。

    char tmp[dec_len]

勿論、配列のサイズとなる、変数dec_lenの値は0(ゼロ)やマイナスにならないよう、きちんとしたチェックはお忘れなく。

int dec2bin(char *bin, int dec_len, char *dec)
{
    int  i;
    int  d, r;
    int  bin_len;
    int  non_zero;
    char tmp[dec_len];
for (i = 0; i < dec_len; i++) tmp[i] = dec[i]; bin_len = 0; do { r = 0; non_zero = 0; for (i = dec_len-1; i >= 0; i--) { d = tmp[i]; tmp[i] = d >> 1; if (r > 0) tmp[i] += 10/2; if (tmp[i] > 0) non_zero = 1; r = d & 1; } bin[bin_len++] = r; } while (non_zero); return bin_len; }

ただ、可変長配列はどこでも使えるわけではない。可変長配列が使えるのは、ブロックの中か関数引数/プロトタイプの中だけで、グローバル変数として宣言したり、struct や union の中のメンバとして宣言したりすることはできない。加えて、static や extern 付きの配列は、可変長配列にできない。

また、malloc関数はメモリのヒープ領域を使うのに対し、可変長配列はスタック領域を使うので、ご注意を。つまり、mallocのように、メモリほ確保しておいて、呼び出された親関数に使わせることは可変長配列では不可能!

あくまでも、自関数内か、子孫関数内で使うもの。

Comments are closed.

Post Navigation