ホームページ >バックエンド開発 >C++ >C 配列の終わりの 1 つ先のアドレスを取得することは合法ですか?

C 配列の終わりの 1 つ先のアドレスを取得することは合法ですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-12-26 07:18:45401ブラウズ

Is Taking the Address One Past the End of a C   Array Legal?

末尾の 1 つ先の配列要素のアドレスを取得することは、C 標準で許可されていますか?

以下のコード スニペットは、次のような議論を引き起こしています。 C 標準に従った有効性:

int array[5];
int *array_begin = &array[0];
int *array_end = &array[5];

具体的には、&array[5] は有効ですかこのコンテキストにおける C 式?

C 標準による合法性

C 標準では、この式の正当性が定義されています:

  • C 17 標準 6.5.2.1、段落 2: E1[E2] を次のように定義します(*((E1) (E2))) と同一です。
  • C 17 標準 6.5.3.2、段落 3: [] 式の場合、& 演算子と暗黙の演算子が使用されることを示します。 * は評価されず、&(E1 E2) となります。
  • C 17 標準6.5.6、段落 8: ポインタが配列の末尾を超えた 1 つの要素を指すことを許可しますが、それらの逆参照は禁止します。

解釈

これらのルールを &array[5] に適用すると、 have:

&array[5] = &*(array + 5) = (array + 5)

(配列 5) は配列の終わりの 1 つ先を指しており、逆参照されていないため、これは C 標準による正当な式です.

C 標準との比較

この動作は C 標準とも一致します。これにより、やはり逆参照されない限り、配列の末尾を越えた要素のアドレスを取得できます。

異なる処理の理由

配列 5 を処理する決定&array[4] 1 は、これらの式の異なる目的に基づいています。

  • 配列 5 は、配列の末尾を 1 つ超えたポインター。比較と配列の境界を越えた移動が可能です。
  • &array[4] 1 は存在しない要素への参照を作成しようとします。これにより、未定義の動作が発生します。

以上がC 配列の終わりの 1 つ先のアドレスを取得することは合法ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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