C99では, 実行時に配列の長さを指定できる機能が追加された.
#include <stdio.h> int foo(int n) { int array[n]; int array[0] = 1; int array[1] = 1; for (int i = 2; i < n; i++) { array[i] = array[i-1] + array[i-2]; } return array[n-1]; }
sizeofは実行時に計算される.
ただし, C11ではオプション機能に格下げされている. VLAが実装されていない処理系では, __STDC_NO_VLA__
というマクロが定義されている.
問題点として, メモリがアロケートされるのがスタックかヒープかが実装依存である点がある. GCCではスタックらしい. また, 巨大なVLAを定義しようとするとプログラムはクラッシュする. ある状況では非常に便利だが, 慎重に扱う必要がある.
ちょっと身内で話題になったので簡単にまとめてみた.
参考URL
詳しくはWebで!