C では、NULL ポインターと 0 を指すポインターの違いは何ですか?
5 に答える
ISO / IEC 9899:TC2は次のように述べています6.3.2.3 Pointers
3値が0の整数定数式、またはvoid *型にキャストされたそのような式は、nullポインター定数と呼ばれます55)。nullポインター定数がポインター型に変換される場合、結果のポインターはnullポインターと呼ばれます。任意のオブジェクトまたは関数へのポインタと等しくないことを比較することが保証されています
マクロNULLは、実装定義のnullポインター定数に展開されます。
任意の2つのnullポインタは等しく比較されます。
はいあります。NULL
標準では、常に無効なメモリを指していると規定されています。NULL
しかし、ポインターの整数表現が 0 でなければならないとは述べていません。0以外の実装に出くわしたことはありませんが、それは標準で義務付けられていません。
リテラル0
をポインターに代入しても、ポインターが 0 の整数表現を想定するわけではないことに注意してください。これは、特殊な null ポインター値がポインター変数に代入されることを意味します。
0
ポインタコンテキストでリテラルを評価することは、と同じですNULL
。コンパイラがNULL
ポインタを表すために使用するビットパターンはすべて非表示になっています。
古い comp.lang.c FAQ には null ポインターに関する大きなセクションがあり、一読の価値があります。
NULL
ポインタは、無効なメモリ領域を何らかの形で表す必要があるという考え方です。
したがって、下位メモリセグメントではOSコードがマップされているため、メモリ内のこの領域はユーザーのプログラムに属していないがOSコードにマップされているため、値0が使用されています(NULLポインタを表すため)。