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

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

DDD
リリース: 2024-12-22 02:08:15
オリジナル
739 人が閲覧しました

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート