web-dev-qa-db-ja.com

CではNULLは常にゼロですか?

昨日、中級レベルのソフトウェアエンジニアリングポジションの担当者にインタビューしましたが、彼は、CではNULLが常にゼロであるとは限らず、NULLがゼロでないCの実装を見たことがあると述べました。これは非常に疑わしいと思うが、確かにしたい。彼が正しいかどうか誰でも知っていますか?

(回答はこの候補者に対する私の判断には影響しません。すでにマネージャーに決定を提出しました。)

56
chi42

私はあなたがヌルポインタを意味すると仮定しています。 0と等しいことが保証されています。1 ただし、すべてゼロのビットで表す必要はありません。2

NULLポインターに関する comp.lang.c FAQ も参照してください。




  1. C99、6.3.2.3を参照してください。
  2. 明示的な主張はありません。ただし、C99 7.20.3の脚注を参照してください(コメントの@birryreeに感謝)。
55

Nullポインター定数は常に0です。NULLマクロは、実装によってネイキッド0、または(void *) 0などのキャスト式として定義される場合があります。他のゼロ値整数式(したがって、標準の「実装定義」言語)。

NULLポインターは0以外の場合があります。NULLポインター定数が検出されると、適切なNULLポインター値に変換されます。

13
John Bode

§C99標準の6.3.2.3によると

値が0の整数定数式、またはvoid *型にキャストされる式は、nullポインター定数と呼ばれます)nullポインター定数がポインター型に変換される場合、nullポインターと呼ばれる結果のポインターは、オブジェクトまたは関数へのポインターと等しくないものを比較します。

§7.17はまた言う

[...] NULLは実装定義のNULLポインター定数に展開されます[...]

NULLポインターのアドレスは0とは異なる場合がありますが、ほとんどの場合と同じように動作します。

(これは古いC標準と同じである必要がありますが、現時点では手元にありません)

11
johannes

一部の実装では、ポインターのサイズは整数のサイズと同じではありません。整数コンテキストのNULLは0ですが、実際のバイナリレイアウトはすべて0である必要はありません。

0
pizza