1. ホーム
  2. c

[解決済み] NULLと'ⅳ0'と'0'の違いは何ですか?

2022-03-16 12:14:17

質問

C言語では、さまざまなゼロの値に違いがあるように見えますが --。 NULL , NUL0 .

私は、ASCII文字 '0' は、次のように評価されます。 48 または 0x30 .

NULL のポインタは、通常、次のように定義されます。

#define NULL 0

または

#define NULL (void *)0

さらに NUL 文字 '\0' と評価されるようです。 0 と同じです。

この3つの値が等しくならないことはあるのでしょうか?

これは64ビットシステムでも同じですか?

解決方法は?

注意事項 この回答はC言語に適用され、C++には適用されません。


ヌルポインター

整数の定数リテラル 0 は、使用される文脈によって異なる意味を持ちます。どのような場合であっても、それは値 0 ただ、記述の仕方が違うだけです。

ポインタが定数リテラルと比較される場合 0 であれば、これはポインタがヌルポインタであるかどうかのチェックである。これは 0 は、ヌルポインター定数と呼ばれます。C言語規格では、以下のように定義されています。 0 型にキャストします。 void * はヌルポインタとヌルポインタ定数の両方です。

さらに、可読性を高めるために、マクロ NULL は、ヘッダーファイル stddef.h . お使いのコンパイラによっては #undef NULL というように、何かおかしなものに再定義してください。

そこで、NULLポインタをチェックする有効な方法をいくつか紹介します。

if (pointer == NULL)

NULL はヌルポインタと等しいかどうかを比較するために定義されています。 の実際の定義が何であるかは、実装で定義されています。 NULL は、有効なヌルポインタ定数である限り、有効です。

if (pointer == 0)

0 はヌルポインタ定数の別の表現です。

if (!pointer)

これは if 文は暗黙のうちに "is not 0" をチェックしているので、これを逆にして "is 0" を意味するようにします。

以下は、NULLポインタのチェック方法として無効なものです。

int mynull = 0;
<some code>
if (pointer == mynull)

コンパイラにとっては、これはNULLポインタのチェックではなく、2つの変数の等価チェックなのです。これは かもしれない しかし、これは保証されたものではなく、コンパイラはC標準に従って少なくとも1つの診断メッセージ(警告またはエラー)を出さなければならないのです。

C言語におけるヌルポインタの値は、基礎となるアーキテクチャには関係ないことに注意してください。もし、基礎となるアーキテクチャがヌルポインタの値をアドレス 0xDEADBEEF と定義しているならば、この混乱を解決するのはコンパイラ次第です。

このように、おかしなアーキテクチャであっても、ヌルポインタをチェックする方法としては、以下の方法が有効です。

if (!pointer)
if (pointer == NULL)
if (pointer == 0)

以下は、NULLポインタをチェックするための無効な方法です。

#define MYNULL (void *) 0xDEADBEEF
if (pointer == MYNULL)
if (pointer == 0xDEADBEEF)

これらはコンパイラからは通常の比較とみなされるからです。

ヌル文字

'\0' はヌル文字と定義される。つまり、すべてのビットがゼロに設定された文字である。 '\0' は(他の文字リテラルと同様に)整数定数であり、この場合は値が0である。 つまり '\0' とは完全に等価であり、飾り気のない 0 整数定数で、唯一違うのは 意図 というように、読み手に伝えることができます("私はこれをヌル文字として使っています")。

'\0' はポインタとは関係ありません。しかし、このコードと似たようなものを目にすることがあるかもしれません。

if (!*char_pointer)

は、char ポインタが NULL 文字を指しているかどうかをチェックします。

if (*char_pointer)

は、char ポインタが非 NULL 文字を指しているかどうかをチェックします。

ヌルポインターと混同しないようにしましょう。ビット表現が同じであるため、便利なクロスオーバーのケースがありますが、実際には同じものではありません。

参考文献

参照 comp.lang.cのFAQの質問5.3です。 をご覧ください。 参照 このPDF はC言語規格です。6.3.2.3項 ポインターの項をチェックしてみてください。