このページをはてなブックマークに追加このページを含むはてなブックマーク このページをlivedoor クリップに追加このページを含むlivedoor クリップ

ヌルポインタ(null pointer)

  • 無効なポインタ。
    • どんなオブジェクトへのポインタとも区別できる。
    • どんな関数へのポインタとも区別できる。
  • ヌルポインタを表現する定数がヌルポインタ定数、即ちマクロのNULLである。
    • NULLは各ヘッダの中で、整数値0に割り当てられている。
      • 整数値0は任意のポインタ型に変換可能であり、その結果はヌルポインタになる。
  • ヌルポインタが他のポインタに代入されたり、比較されるときは、そのポインタ型に変換される。
    • 例えば、ヌルポインタはFILE *型やint *型などのあらゆる型へのポインタとの比較が可能である。
    • fopen関数の戻り値はFILE *型で定義されており、ファイルのオープン失敗時にはNULLを返す。このとき、NULLはFILE *型になっている。わざわざNULLかどうかを比較するときに、NULLをFILE *型にキャストする必要はない。
if ((fp = fopen("file", "r")) == NULL)          //○
if ((fp = fopen("file", "r")) == (FILE *)NULL)  //×
  • ヌルポインタの内部表現が全ビット0であるという保障はない。
    • 「int *p = 0;」はint型のポインタpに対して、整数定数の0を代入する。0はヌルポインタに変換されて、pに代入される。つまり、「int *p = NULL;」と同じ意味になる。しかし、pの構成ビットがすべて0であるとは限らない。ヌルポインタの内部表現がどのようになっているかは処理系に依存するからである。
    • よって、「char *p[10]; memset(p, 0, sizeof(char*) * 10);」というコードはメモリをヌルポインタで初期化できているとは限らない。
    • しかし、static char *p[10];であれば、ヌルポインタで初期化される。なぜならば、静的記憶寿命を持つオブジェクトに対して、明示的に初期値を与えなければ0(この場合はヌルポインタ)で初期化されるからである。
      • 関数の外で宣言・定義するオブジェクトは、staticを指定しなくても静的記憶寿命を持つので、staticがなくても問題ない。