ホームページ >バックエンド開発 >C++ >## 無効なポインタを格納すると、C/C では常に未定義の動作になりますか?

## 無効なポインタを格納すると、C/C では常に未定義の動作になりますか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-10-26 02:34:27927ブラウズ

## Is Storing an Invalid Pointer Always Undefined Behavior in C/C  ?

無効なポインターの保存は常に未定義の動作になりますか?

C および C では、無効なポインターを逆参照すると、未定義の動作が発生します。しかし、疑問が生じます: 単に無効なメモリ アドレスをポインタ変数に格納することは、未定義の動作になりますか?

次のコードを考えてください:

<code class="c">const char* str = "abcdef";
const char* begin = str;
if (begin - 1 < str) { /* ... do something ... */ }</code>

ここで、式 begin - 1 は次のように評価されます。無効なメモリアドレスです。これを逆参照することは控えますが、その有効性を判断するためにポインタ演算に利用します。それでは、特定のアーキテクチャが無効なポインタをレジスタにロードするときにバス エラーを引き起こす可能性があることを考慮すると、この操作には未定義の動作が伴うのでしょうか?

この質問に対する答えは C または C 標準の中にあります。 C ドラフト標準によれば、無効なポインタを格納することは実際には未定義の動作です。標準のセクション 6.5.6/8 ではポインタ演算を定義していますが、オペランドが無効なメモリ アドレスを指している場合は明示的にカバーされていません。

したがって、C 標準では省略により、このケースは未指定のままになっています。未定義の動作をレンダリングします。したがって、無効なポインタをポインタ変数に格納することは、たとえ逆参照されていなくても、現在の標準に従って C および C では未定義の動作とみなされます。

以上が## 無効なポインタを格納すると、C/C では常に未定義の動作になりますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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