|
===================================== 〔語彙分解〕的な部分一致の検索結果は以下の通りです。
ヌルポインタ()とは、何のオブジェクトも指していないことを表す特別なポインタである。 プログラムではヌルポインタを、不定長のリストの終端を表したり、何らかの動作の結果が失敗であることを表したりするのに使用する。後者の用法は、やの''Nothing''値を使用することもできる。 ヌルポインタの値や型がいかなるものかという詳細は言語によって異なる。実際的にはいかなるオブジェクトも参照しないという言語もあり、参照先を求めようとするとJava(NullPointerException)のように例外が発生するものもある。 ヌルポインタはほとんどの処理系(この場合、言語処理系プログラムだけではなく、ハードウェアまでを含めて)で、内部的に0で表現されるが、ごく希に、0でない処理系もある。言語仕様上の意味としては普通「アドレス0(あるいは他のアドレス)を指し示すポインタ」ではなく、どこも指し示さないものとされる。 ヌルポインタを未初期化のポインタと混同してはならない。ヌルポインタは、あらゆる有効なオブジェクトとも異なることが保証されている。それに対し、言語や実装によっては、未初期化のポインタはそのような保証はなく、他のオブジェクトやヌルポインタと同じになる可能性がある。 ヌルポインタはヌル値とは意味が違う。ヌルポインタは多くのプログラミング言語において「値がない(no value)」ことを意味し、ヌル値はリレーショナルデータベースにおいて「未詳値(unknown value)」であることを意味する。ほとんどのプログラミング言語では2つのヌルポインタは等しいが、リレーショナルデータベースエンジンは2つのヌル値を等しいとはみなさない(それらは未詳値を表しているので、それらが等しいかどうかはわからない)。 == C言語 == C言語では、すべての型の2つのヌルポインタは等しいことが保証されている〔ISO/IEC 9899, clause 6.3.2.3, paragraph 4.〕。マクロ NULL が処理系定義のヌルポインタ定数と定義されている〔ISO/IEC 9899, clause 7.17, paragraph 3: ''NULL... which expands to an implementation-defined null pointer constant...''〕。C89 (ISO/IEC 9899:1990) や C99 (ISO/IEC 9899:1999) では、NULL はヌルポインタ定数を表現する物として定義され、ヌルポインタ定数は整数定数の 0 もしくは 0 を void に型キャストしたものとして定義されている。POSIX.1-2008 では整数定数の 0 ではなく、0 を void に型キャストした物、(void でなければならないと定義していて、rationale にて、整数の 0 ではあってはならないと、その定義の差を明記している〔stddef.h - standard type definitions - The Open Group Base Specifications Issue 7 〕。よって、ほぼ全ての標準Cライブラリは NULL を (void としている。そして、C89, C99 では、ヌルポインタ定数を、(void 以外を含めた)ポイント型に型キャストした物をヌルポインタと定義している。ほとんどの実装はそのまま変換するが、C89, C99 の仕様では、整数からポインタ、ポインタから整数への型キャストがどのような結果になるかは実装依存と明記されていて、ポインタに 0 や NULL を代入したときに、ほとんどのコンパイラは数値の 0 を代入したというコンパイル結果を生成するが、数値の 0 以外を代入するというコンパイル結果を生成しても良いという仕様になっている〔Can a conforming C implementation #define NULL to be something wacky - Stack Overflow 〕。ただし、ヌルポインタを整数に型キャストしたら 0 にならないといけない、存在するオブジェクトや関数へのポインタはヌルポインタであってはならないと規定されている。近年はほとんど無いが、歴史的には、ヌルポインタを 0 以外で表現することもあった〔comp.lang.c FAQ list - Question 5.17 〕。ヌルポインタを参照して、そのメモリアドレスに読み書きしようとすると、それは何も指していないため、セグメンテーション違反やアクセス違反が発生する。この場合、プログラムがクラッシュするか、例外に変換される。しかし、そのどちらにもならない場合も存在する。例えば、x86のリアルモードではアドレス0000:0000は読み書きが可能であり、ヌルポインタを参照したメモリアクセスは成功しクラッシュはしないものの、不定の期待しない動作になる。ただし、ヌルポインタへの参照があえて定義されている場合もある。例えば、16ビットのリアルモードx86デバイスのためにCで記述されたBIOSコードは、ヌルポインタを参照することにより、物理アドレス0に(IDT)を書く場合がある。ヌルポインタの参照をしないようにコンパイラが最適化することもできる。それにより、セグメンテーション違反を避けられるが、他の望ましくないふるまい を引き起こす。 抄文引用元・出典: フリー百科事典『 ウィキペディア(Wikipedia)』 ■ウィキペディアで「ヌルポインタ」の詳細全文を読む スポンサード リンク
|