星にゃーんのブログ

ほとんど無害。

CのVariable-length array

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で!