ホームページ >バックエンド開発 >C++ >C で 2D 配列を連続した 1D 配列としてアクセスするのは未定義の動作ですか?

C で 2D 配列を連続した 1D 配列としてアクセスするのは未定義の動作ですか?

DDD
DDDオリジナル
2024-12-22 02:08:15691ブラウズ

Is Accessing a 2D Array as a Contiguous 1D Array in C Undefined Behavior?

2D 配列は連続した 1D 配列として扱うことができますか?

C で添字を付けると、ポインタの加算とそれに続く間接演算が行われます。次のコードを考えてみましょう:

int a[25][80];
a[0][1234] = 56;
int* p = &a[0][0];
p[1234] = 56;

2 行目は未定義の動作を呼び出しますか? 4 行目はどうでしょうか?

答え:

どちらの行も未定義の動作になります。

C に従って標準では、配列要素へのポインタの追加は、結果のインデックスが配列の範囲内にある場合にのみ有効な動作になります。この場合、a[0] のサイズは 80 で、この範囲外のインデックスは定義されていません。

説明:

添え字は次と同等です:

a[0][1234] == *(a[0] + 1234)

a[0] は a の 1 行目の最初の要素を指しているので、ポインタ加算 a[0] 1234 は行の末尾を越えて要素にアクセスしようとします。これにより、未定義の動作が発生します。

同様に、4 行目は行の境界外の値を変更しようとします。

p[1234] == *(p + 1234)

p が a の最初の要素を指しているにもかかわらず、基になる行の境界を超えて要素を変更すると、未定義の動作が発生します。

この種の未定義の動作は、によっては検出されないことに注意することが重要です。コンパイラ。したがって、実行時にポインター算術演算が有効な配列要素の範囲内に収まるようにすることが重要です。

以上がC で 2D 配列を連続した 1D 配列としてアクセスするのは未定義の動作ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。