1

配列がローカルの場合、スタックにサイズが割り当てられていることはわかっています。コード内の次の配列にメモリはどのように割り当てられますか。また、-20のような負の入力を与えると、答えは-80になります。これは、以前のコンパイラでエラーを発生させるために使用されますが、現在は使用されていません。それで、それは今どのように扱われますか?

int main()
{
  int i;
  scanf("%d",&i);
int a[i];
printf("%d",sizeof(a));
}
4

1 に答える 1

4

あなたが持っているのはVariable length array(VLA)です。これは C 標準では許可されていますが、C++ では許可されていません。
ただし、ほとんどの C++ コンパイラは、コンパイラ拡張機能を通じてサポートを提供しています。C++ 標準は、std::vectorVLA を使用するとコードが移植できなくなるため、VLA を介して C++ で通常使用される を提供します。

ユーザー プログラムの場合、VLA の要素は、通常の配列の場合と同様に連続したメモリ位置に配置されます。唯一の違いは、配列の長さを実行時に指定できることです。

VLA に負のサイズを指定すると、呼び出されるのはUndefined Behaviorです。

参照:
C99 標準 §6.7.5.2:

サイズが整数定数式ではない式の場合... ...評価されるたびに、ゼロより大きい値を持つ必要があります。

于 2012-08-18T14:20:27.047 に答える