NULL
C では常に false に変換されると仮定しても安全ですか?
void *somePtr = NULL;
if (!somePtr) {
/* This will always be executed? */
}
または、値に対する明示的なチェックを行う必要がありNULL
ますか?
はい。C ではゼロ以外の値は真であり、ゼロ値は偽であると見なされるため、NULL は偽と評価されます。NULL は本質的にzero
アドレスであり、比較ではそのように扱われます。ブールチェックでは int に昇格されると思います。あなたのコードは C に詳しい人なら誰でも読めると思いますが、私はおそらくチェックを明示的にします。
C および C++ プログラミングでは、2 つのヌル ポインターが等しいことが保証されます。ANSI C は、整数型との比較でヌル ポインターが 0 になることを保証します。さらに、マクロ NULL はヌル ポインター定数、つまり値 0 (整数型として、または void へのポインターに変換される) として定義されているため、ヌル ポインターは NULL と等しくなります。
「C」言語は、(void*)0 が実際に有効なポインターである可能性がある時代にさかのぼります。それほど昔のことではありませんが、8080 および Z80 マイクロプロセッサにはアドレス 0 に割り込みベクトルがありました。このようなアーキテクチャの選択に直面すると、ヘッダー ファイルに NULL の値を宣言させる以外に何もできませんでした。NULL が (void*)0 (次の選択肢は 0xffff でした) と等しくないため、if() ステートメントに未定義の動作を与えるコンパイラがいくつかありましたが、今では忘れられています。
C++ は容赦なくこれに終止符を打ち、null ポインターは 0 から代入可能であり、0 に対してテスト可能です。
何かを想定することは決して安全ではありません。
明示的なチェックは、テスト対象についてより明確になります。
はい (少なくとも、標準準拠の C コンパイラの場合は!)
Q: null 以外のポインターをテストするための省略されたポインター比較 ``if(p)'' は有効ですか? null ポインターの内部表現が非ゼロの場合はどうなるでしょうか?
A: 常に有効です。
NULL は単なるプリプロセッサ定義です。stdio.h にあります。通常、非常識な人だけがそれを再定義しますが、それは可能です。例:
#include <stdio.h>
#ifdef NULL
#undef NULL
#endif
#define NULL 1
void main()
{
if (NULL)
printf("NULL is true\n");
else
printf("NULL is false\n");
}
このコードは、「NULL is true」と出力します。信じられないなら試してみてください。コンパイラは、何か変なことをしていることを警告さえしないかもしれません。
NULL
メモリ内の役に立たない/存在しない場所を指すことが保証されている定数ポインタとして定義されています。のほとんどの実装はそうですNULL
が((void *)0)
、そうであることが必須ではありません。
はい、ほとんどです。
まず、NULL は typedef です。以前に含まれていたヘッダーで言うことで、あなたをひどく台無しにすることができました
#define NULL 1
これはあまり意味がないかもしれませんが、いつから他の人のコードが意味をなすようになったのでしょうか? :)
また、おそらく構文的には安全ですが、意味的には正しくありません。NULL は「何もない」ことを意味し、true でも false でもブール値でも int でも string でもありません。「無の象徴」という意味です。したがって、NULL のテストは、より哲学的な問題に似ています。木が森に落ちた場合、if(listener)
音はしますか?
NULL に対するテストについて明確にしてください。
*NULL は常に 0x00L を対象とします。これは false と見なすことができますが、必ず明示的なチェックを必ず行ってください。