2013-03-18 10 views
10

Kenneth ReekがCの本を読んでいるだけです。 NULバイトはビットがすべて0で、'\0'のように書かれ、NULLは0の値を持つポインタを参照する値を持ちます。CでNULとNULLを入れ替えることはできますか?

どちらも整数であり、同じ値であるため、互換性があります。

と、このコード:このコードで

char const *keyword[] = { "do", "for", "if", "register", 
           "return", "switch", "while", NULL }; 

、NULLは、テーブルを検索機能はテーブルの終わりを検出することができます。では、NULLマクロとNULマクロを交換できますか?

+0

試しましたか?文字列には ''\ 0' 'を、ポインタには' NULL'または 'nullptr'を使います。 – antonijn

+3

*ので、彼らは互換的に使用することができます*恐ろしいアドバイス。 – cnicutar

答えて

15

NULはヌルポインタにstddefで定義されたマクロASCII文字コード0

NULLの表記法です。

ですので、です。これらは互換的に使用することはできません。

+1

NULLはポインタ(通常は32または64ビット)のサイズを持ちます。 NULは文字サイズ(通常Cでは8ビット、16ビットUnicodeをサポートする他の言語では16ビット)を持っています。 これらは互換的に使用することはできません。文字列に0を使用している場合は、NULです。ポインタに0を使用している場合、NULLです。 Cにはマクロだけがあります。Cでは、すべてのリテラル文字列にコンパイラによって自動的に末尾にNUL 0バイトが追加されるため、マクロは必要ありません。 – nonrectangular

+0

@nonrectangular "NULLはポインタのサイズを持っています" - 多分。それは 'int'のサイズを持つかもしれません。 「NULL」の_タイプ_は指定されていません。 – chux

12

マクロの標準化NULはまた、NULLは、それが「ねえ、私たちは、ポインタを扱っている」ことを読者に知らせることリテラル平野0以上の利点があり、少なくともではないC.

に、ありませんこれは利点と考えられるかもしれない。

C++では、イディオムが長い間、0と書かれていましたが、それらは逆になっているように見えて、何らかの理由で新しいリテラルnullptrを導入しました。

Cでは、ポインタの場合はNULL、文字の場合は'\0'と書くことをおすすめします。

+2

あなたのコードがC++ 11になった場合、 'NULLptr 'で' NULL'を検索して置き換えることができるので、余分な型の安全性が得られるので、文字にはNULLを使用しないでください。また、ポインタではない整数定数ゼロにNULLを使用するたびに、これがより困難になります。 – Yakk

+0

nullptrの理由は、void *ポインタです。 CのNULLはそうではありません。したがって、「何らかの理由」は型の安全性のためです – pm100

関連する問題