昨日、中級レベルのソフトウェアエンジニアリングポジションの担当者にインタビューしましたが、彼は、CではNULLが常にゼロであるとは限らず、NULLがゼロでないCの実装を見たことがあると述べました。これは非常に疑わしいと思うが、確かにしたい。彼が正しいかどうか誰でも知っていますか?
(回答はこの候補者に対する私の判断には影響しません。すでにマネージャーに決定を提出しました。)
私はあなたがヌルポインタを意味すると仮定しています。 0
と等しいことが保証されています。1 ただし、すべてゼロのビットで表す必要はありません。2
NULLポインターに関する comp.lang.c FAQ も参照してください。
Nullポインター定数は常に0です。NULL
マクロは、実装によってネイキッド0
、または(void *) 0
などのキャスト式として定義される場合があります。他のゼロ値整数式(したがって、標準の「実装定義」言語)。
NULLポインター値は0以外の場合があります。NULLポインター定数が検出されると、適切なNULLポインター値に変換されます。
§C99標準の6.3.2.3によると
値が0の整数定数式、またはvoid *型にキャストされる式は、nullポインター定数と呼ばれます)nullポインター定数がポインター型に変換される場合、nullポインターと呼ばれる結果のポインターは、オブジェクトまたは関数へのポインターと等しくないものを比較します。
§7.17はまた言う
[...] NULLは実装定義のNULLポインター定数に展開されます[...]
NULLポインターのアドレスは0とは異なる場合がありますが、ほとんどの場合と同じように動作します。
(これは古いC標準と同じである必要がありますが、現時点では手元にありません)
一部の実装では、ポインターのサイズは整数のサイズと同じではありません。整数コンテキストのNULLは0ですが、実際のバイナリレイアウトはすべて0である必要はありません。