21
nullポインタにアドレス0が使用されるのはなぜですか?
C(またはそのことについてはC ++)では、値がゼロの場合、ポインターは特別です。メモリーを解放した後、ポインターをゼロに設定することをお勧めします。mallocを呼び出すと、メモリを取得できない場合は値0のポインタが返されます。私はif (p != 0)常に、渡されたポインタが有効であることなどを確認するために使用しています。 しかし、メモリアドレス指定は0から始まるので、0は他のアドレスと同じように有効なアドレスではありませんか?その場合、nullポインターの処理に0をどのように使用できますか?代わりに負の数がnullにならないのはなぜですか? 編集: 良い答えがたくさん。私の心がそれを解釈しているように表現された答えで言われたことを要約し、私が誤解した場合、コミュニティが私を修正してくれることを願っています。 プログラミングの他のすべてのように、それは抽象化です。単なる定数であり、実際にはアドレス0に関連していません。C++ 0xは、キーワードを追加することでこれを強調していnullptrます。 これはアドレスの抽象化でもありません。C標準で指定されている定数であり、コンパイラが「実際の」アドレスと決して等しくないことを確認する限り、他の数値に変換できます。0がプラットフォームに使用するのに最適な値。 初期の場合のように抽象化されていない場合、アドレス0はシステムによって使用され、プログラマーの立ち入りを制限します。 私の負の数の提案は少しワイルドなブレーンストーミングだったと私は認めます。アドレスに符号付き整数を使用することは、ヌルポインター(-1など)を除いて、値空間が有効なアドレスを作る正の整数と無駄になる負の数に均等に分割されることを意味する場合、少し無駄です。 いずれかの数値が常にデータ型で表現できる場合、それは0です(おそらく1もそうです。符号なしの場合は0または1になる1ビット整数、または符号付きの場合は単に符号付きビット、または[-2、1]になります。ただし、0がnullで、1がメモリ内の唯一のアクセス可能なバイトであることを確認できます。) それでも未だに未解決な部分があります。スタックオーバーフローの質問特定の固定アドレスへのポインターは、nullポインターの0が抽象化であっても、他のポインター値は必ずしもそうではないことを示しています。これにより、別のスタックオーバーフローの質問を投稿するようになりました。アドレス0にアクセスできますか?。