[解決済み] ヌルポインタのアドレスはなぜゼロなのですか?
質問
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++ では、同じ型へのポインタに対してのみ保持する必要があるように、この点が改良されています)。
関連
-
[解決済み】cc1plus:エラー:g++で認識されないコマンドラインオプション"-std=c++11"
-
[解決済み] to_string は std のメンバーではない、と g++ が言っている (mingw)
-
[解決済み】VC++の致命的なエラーLNK1168:書き込みのためにfilename.exeを開くことができません。
-
[解決済み] SQLiteのINSERT/per-secondのパフォーマンスを向上させる
-
[解決済み] なぜテンプレートはヘッダーファイルでしか実装できないのですか?
-
[解決済み] なぜ、オブジェクトそのものではなく、ポインタを使用しなければならないのですか?
-
[解決済み] 配列の場合、なぜ a[5] == 5[a] になるのでしょうか?
-
[解決済み] リファレンスとポインタの使い分け
-
[解決済み] C言語でのポインタ:アンパサンドとアスタリスクはいつ使うのか?
-
[解決済み】C++でポインタにNULLと0(ゼロ)のどちらを使うか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】LLVMで暗黙のうちに削除されたコピーコンストラクタの呼び出し
-
[解決済み】Visual Studio 2015で「非標準の構文。'&'を使用してメンバーへのポインターを作成します」エラー
-
[解決済み】クラステンプレートの引数リストがない
-
[解決済み】C++エラーです。"配列は中括弧で囲まれたイニシャライザーで初期化する必要がある"
-
[解決済み] 既に.objで定義されている-二重包含はない
-
[解決済み】浮動小数点例外エラーが発生する: 8
-
[解決済み】Visual Studio 2013および2015でC++コンパイラーエラーC2280「削除された関数を参照しようとした」が発生する
-
[解決済み】C++ - 適切なデフォルトコンストラクタがない [重複]。
-
[解決済み】Visual Studioのデバッガーエラー。プログラムを開始できません 指定されたファイルが見つかりません
-
[解決済み] ポインタを削除した後、NULLにするのは良い習慣ですか?