配列の大きさは変数によって動的に変えられる。
「ISO/IEC 9899 : 1999 - Programming Language C」(略称C99)という新しい規格のC言語では、配列の宣言が、そのサイズを変数で指定できるようになった。いわゆる、可変長配列 (Variable-size array) が使える。
たとえば、以下の関数は巨大な10進数を2進数に変換するものだが、一時的に加算の中間結果を保存するため、配列 tmp[] が必要。しかし、関数が呼び出されるまでは配列のサイズが判らないので、いままでのCなら malloc関数等を利用してメモリを確保しないといけなかったが、可変長配列を使えば、すっきりした書き方ができる。
char tmp[dec_len]
勿論、配列のサイズとなる、変数dec_lenの値は0(ゼロ)やマイナスにならないよう、きちんとしたチェックはお忘れなく。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
int dec2bin(char *bin, int dec_len, char *dec) { int i; int d, r; int bin_len; int non_zero; char tmp[dec_len];<br> 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のように、メモリほ確保しておいて、呼び出された親関数に使わせることは可変長配列では不可能!
あくまでも、自関数内か、子孫関数内で使うもの。