2009-08-14 15 views
8

(私はnullが何であり、どのようなものが使用されているかを知っています)ヌルはどのような価値がありますか?

質問:どのような言語でもオブジェクトへの参照を作成するとします。コンピュータは、その参照用にメモリ内のわずかな32ビット(またはコンピュータのデザインに応じて他のサイズ)の領域を作成します。そのメモリは、メモリ内のオブジェクトの位置を表す値に割り当てることができます。しかし、nullに参照を設定すると、実際にどのような価値がありますか? (リファレンス内の個々のビットは何に設定されていますか?)ビットはゼロになっていますか?しかし、それも記憶の場所ではないでしょうか?参照はオブジェクトへの参照ではなくヌルを含むとコンピュータからどのように伝えられますか?

私はこれが重要な質問ではないことを知っていますが、どのように動作するのか不思議です。

みんなありがとう:ポインタについて話したときにC++背景NULLの標準的な定義をから来るD

+0

http://en.wikipedia.org/wiki/Pointer_(computing)#The_null_pointerを参照してください(ただし、私は答えでWikipediaを引用するのが嫌です)。 –

答えて

14

ありますその答えには2つの半分:値がゼロである

  • (すなわち値のすべてのビットがゼロである。)
  • ゼロは有効なアドレスと見なされることはありません。

2番目の点は、質問に「なぜでもメモリ内の場所ではありませんか」という理由です。 "いいえ"です - それはゼロが有効なメモリ位置と見なされないという単純なルールです。それにアクセスしようとすると例外が発生します。

編集:According to Wikipedia(したがって、それは真でなければなりません8-)「一部のアーキテクチャでは、符号付きアドレス空間を使用し、最も負の値を使用します」。したがって、すべてのアーキテクチャで必ずしもゼロであるとは限りませんが、特定のアーキテクチャー上のどのような値であれ、その値は無効なメモリー位置と見なされます。

+2

"単にゼロが有効なメモリ位置と見なされないというルールです" - これは真ではありません。いくつかのシステムで有効なページに0をマップするのは完全に合法的です(信じられないほど恐ろしい場合)。しかし、特にCやC++の場合、標準では0が無効なポインタであることが要求されているため、どのように相互作用するかはわかりません。 – Promit

+4

標準では、ゼロが無効なアドレスであることを要求しません。アドレスをゼロと比較するたびに、コンパイラはそのゼロをそのアーキテクチャ上の標準の不正なアドレスに変換する必要があります。 x86 Linuxでは無効なページもゼロであるが、必ずしもそうである必要はありません。 – kmm

7

は0です。私は他の言語も同様に動作すると仮定します。

+0

これはほとんどの言語で当てはまり、実際にはCPU /アーキテクチャによって異なるだけです。 –

+1

私は漠然としたことに、いくつかのアーキテクチャ(PDPバリアント?)はnullではないヌルポインターを持っていたが、逆参照のために等しく無効だったメモリーアドレスを指していたことを覚えておいてください。グーグルにもかかわらず私はこの参照を見つけることができません。 –

+2

C++コードのヌルポインタの値と、C++標準の4.10/1セクションごとにゼロでなければならない、コンパイラが使用するヌルポインタの内部表現を混同しないでください。 –

8

.NETでは、null値は「すべてゼロ」のビットパターンで表されます。

新しい配列やオブジェクトを正しく作成するには、コンストラクタ、変数初期化子などを適切に起動する前に、メモリを消去してすべてのフィールドに適切なデフォルト値を作成する必要があります。

(私はこれが指定されている場所を見つけるためにしようとしてきた、と私は今のところ失敗しています...しかし、それはどんな意味がある唯一の実装です。私は見ておこう。)

+1

Ecma334、p122では、[注:デフォルト値への初期化は、通常、メモリを全ビット0に初期化することによって行われます。一般的な修飾子と[注釈]コンテキストに注意してください。 –

+1

@Henk:それはC#です - 私は非常に故意に自分自身を制限しました。C#の代わりにNETを使用しています:) –

+0

Jon、特定の言語がこれを異なる方法で実装できるとは思われません。メモは「メモリマネージャ」に関するものです。 –

2

参照はオブジェクトへの参照ではなくヌルを含むと、コンピュータはどのように伝えますか?

Wikipediaによれば、特定の言語でのヌルポインタは、メモリ内の固定アドレスであってもよいし、どのユーザプログラムがアクセスすることはできませんので、このアドレスへのいくつかのオブジェクトポイント場合、それはそうでなければ、それはない、ヌルです。

0

http://googleit1st.com/search?hl=en&q=null+pointer

ヌルポインタ又はnull参照 ヌルは、特別なポインタ値(またはオブジェクト参照の他の種類の)オブジェクトポインタが意図的に指していないことを意味する(または参照)するために使用されます。そのようなポインタはヌルポインタと呼ばれます。1多くの実装では、ほとんどのCPUのアドレス空間の最下位にあるので(ただし、一部のアーキテクチャでは符号付きアドレス空間が使用され、負の値が最も大きくなります)、NULLポインタを表すために0(すべてのビットが0)の値が使用されます。多くのオペレーティングシステムは、このメモリアドレスにアクセスしようとすると例外を生成します。 Pascal、Ruby、LuaなどではNothing 2、Visual BasicではNothingが使用され、PythonではNoneが使用されています。 Fortranでは、nullを定数にするのではなく、NULLIFY命令で設定し、ASSOCIATED関数でテストできるプロパティと見なします。 Taken from wikipedia

3

すべての言語が特定の値を使用するわけではありませんが、nullがオブジェクトであることがあります。動的言語には、オブジェクト参照が値を持たないときに設定されるnullを表すグローバルオブジェクトが存在することがよくあります。このような場合、nullオブジェクトに対してメソッド呼び出しを行い、適切なレスポンスを作成することができます。

たとえば、Rubyには、nilやnilなどの一般的なメソッドがあります。 to_sには、nullオブジェクトで呼び出された場合に期待される適切なデフォルト実装があります。

Javaでは、nullは仮想マシンの仕様で完全に指定されています。その実際の値は実際には指定されておらず、むしろバイトコード命令がそれを見るときに何が起こるべきかを示します。

Nullは、オブジェクト参照がnilオブジェクトを指すように設定することで通常「処理」されます。しかし、より抽象度の低い言語は、メモリ内の場所である値としてゼロを使用することができますが、オペレーティングシステムがプログラムを実際に書き込むのを停止し、代わりにコアダンプやプログラムを停止します。

4

回答するC#

CLRにはヌルのオペコードがあります。あなたが見ることができるように

String s = "ff"; 

    s = null; 

このIL

.locals init ([0] string s) 
    IL_0000: nop 
    IL_0001: ldstr  "ff" 
    IL_0006: stloc.0 
    IL_0007: ldnull 
    IL_0008: stloc.0 

を生成し、RAMの最初のページは、通常はユーザ空間から保護されているヌル

1

の特別な値を扱うldnullオペコードがありますプログラム。プログラマがヌルポインタをチェックするのを忘れると、プログラムがその場所にアクセスしようとすると、プログラムは少なくともページフォールトを引き起こします。

したがって、[0x00000000]は技術的には実際のメモリ位置ですが、ほとんどのプログラムはそれにアクセスできません。

x86私が正しく覚えている場合、プロセッサには特別なテーブルがあります。

関連する問題