1. ホーム
  2. c++

[解決済み] ヌルポインタのアドレスはなぜゼロなのですか?

2022-07-27 07:14:47

質問

C言語(またはC++)では、ポインタの値がゼロである場合、それは特別なものです。ポインタのメモリを解放した後、ポインタをゼロに設定するよう助言されました。それは、ポインタを再び解放しても危険ではないことを意味するからです。 if (p != 0) を常に使用して、渡されたポインタが有効であることを確認する、などです。

しかし、メモリアドレッシングは 0 から始まるので、0 は他のアドレスと同様に有効ではないのでしょうか?その場合、どのようにして null ポインターを処理するために 0 を使用することができるのでしょうか。なぜ負の数は代わりに null でないのでしょうか?


編集してください。

良い回答の数々 私は、私自身の心が解釈するように表現された回答で言われていることを要約し、私が誤解している場合はコミュニティの人々が訂正してくれることを望みます。

  • プログラミングにおける他のすべてのものと同様に、それは抽象的なものです。単なる定数であり、アドレス0にはあまり関係がありません。C++0xでは、このことを強調するために、キーワード nullptr .

  • これはアドレスの抽象化ですらなく、C 標準によって指定された定数であり、コンパイラーは、それが決して "real"アドレスに等しくないことを確認し、0 がプラットフォームで使用するのに最適の値ではない場合は他の null ポインターに等しいことを確認する限り、他の数に変換することが可能です。

  • 抽象化されていない場合、初期のころはそうでしたが、アドレス 0 はシステムによって使用され、プログラマーには立ち入り禁止です。

  • 私の負の数の提案は、少し乱暴なブレーンストーミングであったと認めます。アドレスに符号付き整数を使用することは、ヌル ポインター (-1 など) を除けば、値空間が有効なアドレスを作る正の整数と無駄になる負の数で均等に分割されることを意味すると、少し無駄が生じます。

  • データ型によって常に表現可能な数があるとすれば、それは 0 です (おそらく 1 もそうでしょう。私は、符号なしなら0または1、符号付きなら符号付きビットだけとなる1ビット整数、または[-2, 1]となる2ビット整数を思い浮かべます。しかし、それなら0がNULLで、1がメモリ内の唯一のアクセス可能なバイトになるようにすればよいのです)。

まだ、私の心の中で未解決のものがあります。Stack Overflow の質問 特定の固定アドレスへのポインタ は、ヌルポインタの0が抽象的であっても、他のポインタの値は必ずしもそうではないことを教えてくれます。このことから、私は別の Stack Overflow の質問を投稿することにしました。 アドレス 0 にアクセスしたいと思うことはありますか? .

どのように解決するのですか?

2点です。

  • はソースコード中の定数値 0 だけがヌルポインタです。コンパイラの実装では、実行中のコードで必要な任意の値を使用することができます。 いくつかのプラットフォームでは、実装がヌル ポインターとして使用する可能性のある「無効な」特別なポインター値があります。CのFAQに質問があります。 "Seriously, have any actual machines really used nonzero null pointers, or different representations for pointers to different types?" という質問があり、C ソースで 0 がヌル ポインターであるというこのプロパティを使用しながら、実行時には異なる表現をするいくつかのプラットフォームがあることを指摘しています。C++ 標準には、値 0 を持つ積分定数式を変換すると常に null ポインタが生成されるが、値 0 を持つ他の式を変換すると null ポインタが生成される必要はないことを明確にする注記がある。

  • C 標準は、単に null ポインターを示すために使用する何かを選択しなければならず、0 が選択されました。 正直なところ、他のセンチネル値が検討されたかどうかはわかりません。

ヌルポインタの要件はただひとつ。

  • 実際のオブジェクトへのポインタと不等間隔で比較されることが保証されています。
  • 2 つの NULL ポインタは等しく比較されます (C++ では、同じ型へのポインタに対してのみ保持する必要があるように、この点が改良されています)。