配列がローカルの場合、スタックにサイズが割り当てられていることはわかっています。コード内の次の配列にメモリはどのように割り当てられますか。また、-20のような負の入力を与えると、答えは-80になります。これは、以前のコンパイラでエラーを発生させるために使用されますが、現在は使用されていません。それで、それは今どのように扱われますか?
int main()
{
int i;
scanf("%d",&i);
int a[i];
printf("%d",sizeof(a));
}
配列がローカルの場合、スタックにサイズが割り当てられていることはわかっています。コード内の次の配列にメモリはどのように割り当てられますか。また、-20のような負の入力を与えると、答えは-80になります。これは、以前のコンパイラでエラーを発生させるために使用されますが、現在は使用されていません。それで、それは今どのように扱われますか?
int main()
{
int i;
scanf("%d",&i);
int a[i];
printf("%d",sizeof(a));
}
あなたが持っているのはVariable length array(VLA)です。これは C 標準では許可されていますが、C++ では許可されていません。
ただし、ほとんどの C++ コンパイラは、コンパイラ拡張機能を通じてサポートを提供しています。C++ 標準は、std::vector
VLA を使用するとコードが移植できなくなるため、VLA を介して C++ で通常使用される を提供します。
ユーザー プログラムの場合、VLA の要素は、通常の配列の場合と同様に連続したメモリ位置に配置されます。唯一の違いは、配列の長さを実行時に指定できることです。
VLA に負のサイズを指定すると、呼び出されるのはUndefined Behaviorです。
参照:
C99 標準 §6.7.5.2:
サイズが整数定数式ではない式の場合... ...評価されるたびに、ゼロより大きい値を持つ必要があります。