私は C プログラミングが初めてで、2D 整数配列 (行列) を使用する必要があります。たとえば、私はこれを行います:
void main(){
int matrix[2][2] = { {0,1}, {2,3} };
printf("%i", matrix[4][4]); /*Here should be an index error, but that doesn't happen*/
}
なにが問題ですか?
私は C プログラミングが初めてで、2D 整数配列 (行列) を使用する必要があります。たとえば、私はこれを行います:
void main(){
int matrix[2][2] = { {0,1}, {2,3} };
printf("%i", matrix[4][4]); /*Here should be an index error, but that doesn't happen*/
}
なにが問題ですか?
なにが問題ですか?
間違っているのは、コンパイラや言語に関するあなたの仮定です。C には境界チェックがありません。範囲外の配列にアクセスしている場合、コンパイラは警告しません。
代わりに何が起こるか: コードは無効になり、未定義の動作を呼び出すと言われ、必要なことは何でも自由に実行できます (クラッシュしたり、一見「正常に動作している」など)。
これは、他の一部の言語とは異なり、未定義の動作です。C は境界チェックを行わず、 の付属書J.2 Undefined behavior
にC99 draft standard
次の特定の例が示されています。
— オブジェクトが与えられた添字で明らかにアクセス可能であっても、配列添字は範囲外です (宣言 int a[4][5] が与えられた左辺値式 a[1][7] のように) (6.5.6) .
C は、配列インデックスの境界チェックを実行しません。これにより、off-by-one エラーやバッファ オーバーフローが発生する可能性がありますが、コードの実行速度も向上します。C プログラマーは、有効なインデックスのみを使用するようにする責任があります。
言うまでもなく、Cにはインデックスエラーはありません。インデックス チェックは行いません。C では、プログラマーはすべてを知っている全能者なので、コンパイルして実行するという意味で、あなたが行うことはすべて「合法的」です。matrix[4][4]
何が起こっているかを行うと、未定義の動作になります。スタックのどこかにインデックスを作成し、そこにあるものを取得して int として解釈しています。のようにバインドされたばかげた配列にアクセスしようとするとmatrix[300][200]
、セグメンテーション違反が発生する可能性が高くなります。