C 標準では、多くの下限/上限 (変換制限) が定義されており、各変換に対して実装が満たす必要があることが課されています。配列サイズの最小制限が定義されていないのはなぜですか? 次のプログラムは正常にコンパイルされ、実行時エラー/セグメンテーション エラーが発生し、未定義の動作が発生する可能性があります。
int main()
{
int a[99999999];
int i;
for(i=0;i<99999999;i++)
a[i]=i;
return 0;
}
考えられる理由は、ローカル配列が自動ストレージに割り当てられ、割り当てられたスタック フレームのサイズに依存している可能性があります。しかし、C で定義された他の制限のような最小制限ではないのはなぜですか?
上記のような未定義のケースは忘れましょう。次の点を考慮してください。
int main()
{
int a[10];
int i;
for(i=0;i<10;i++)
a[i]=i;
return 0;
}
上記で、ローカル配列が (非常に小さい配列にもかかわらず) 期待どおりに動作し、割り当ての失敗による未定義の動作を引き起こさないという保証を私に与えるものは何ですか?
このような小さな配列の割り当てが最新のシステムで失敗する可能性はほとんどありません。しかし、C 標準では満たすべき要件が定義されておらず、コンパイラは (少なくとも GCC は) 割り当ての失敗を報告しません。実行時エラー/未定義の動作のみが可能です。難しい部分は、任意のサイズの配列が割り当ての失敗により未定義の動作を引き起こすかどうかを誰も判断できないことです。
この目的のために ( mallocとフレンズを介して) 動的配列を使用でき、割り当ての失敗をより適切に制御できることを認識していることに注意してください。ローカル配列に対してそのような制限が定義されていない理由にもっと興味があります。また、グローバル配列は静的ストレージに格納され、コンパイラが処理できる実行可能サイズが増加します。