通常、配列は次の形式で宣言します。
DataType array_name[SIZE];
SO たとえば、長さ0の配列を作成しようとした場合
int arr[0]; //Line#1
arr[0] = 5; //Line#2
上記のコードを実行してもエラーは発生しません。この場合、メモリは単一の整数に割り当てられますか?
Line#1がコンパイルエラーを生成しないのはなぜですか?
理想的には、そうすべきです!ローカルストレージ
にサイズの配列を作成することは合法的なコードではありません。
理想的には、コンパイラはエラーを発行する必要があります。おそらく、一部のコンパイラ拡張機能でこれをコンパイルできますが、標準では、これは有効なコードではありません。でコンパイルしてみてください。0
-pedantic
参照:
C++03標準8.3.4/1:
_constant-expression +(5.19)が存在する場合、それは整数定数式であり、その値はゼロより大きくなければなりません。
さらに、
Line#2でコンパイルエラーが発生しないのはなぜですか?
割り当てられた配列の境界を超えて書き込むことは未定義動作であるためです。未定義動作では、診断を提供するためにコンパイラは必要ありません。コードが未定義動作を示すと、文字通り何が起こる可能性があり、すべての賭けが無効になることに注意してください。
C / C ++は配列の範囲チェックを行わないため、エラーは発生しません。 arr[10000000]
コンパイルエラーも発生しません。
何が起こるかというと、スタックの一部ではなくarr
、誰が何が起こるかを知っているメモリに書き込んでいるということです。アクセス違反が発生してクラッシュしたり、他のデータ構造がランダムに破損したりする可能性があります。
これはバッファオーバーフローです。