C言語では、NULLは常にメモリ上の存在しない点を指す記号定数である。多くのプログラマーはNULLを0と等しいものとして扱いますが、これは単純化したもので、後でつまずく可能性があります。ポインターをNULLと直接照合し、他のコンテキストでは0を使うのがベストです。そうすれば、NULLを見るたびにポインタを扱っていることがわかるので、コードがすっきりして理解しやすくなります。
NULLチェックの実行
-
標準的なNULLチェック・コードを使用する。以下は、NULLチェックを行うための最もわかりやすい書き方です。この記事では、チェックするポインタの名前をptrとします。
- if(ptr == NULL)
{
// ポインタがNULLの場合のコード
} else {
// NULLでない場合のコード
}
- if(ptr == NULL)
-
NULL以外の値をテストする。代わりに不等式をテストした方が便利な場合もある。ここで驚くことはない:
- if (ptr != NULL) { // NULLでない場合のコード
もしNULLでなければ // コード
}
- if (ptr != NULL) { // NULLでない場合のコード
-
エラーを避けるために最初にNULLを書く(オプション)。PTR == NULLメソッドの主な欠点は、誤って代わりにptr = NULLとタイプし、そのポインタにNULL値を代入してしまう可能性があることです。これは大きな頭痛の種になります。(中略)等しいかどうかのテストはオペランドを対称的に扱うので、代わりに if (NULL == ptr) と書けばまったく同じ結果が得られます。偶発的なNULL==ptrは単純なコンパイル・エラーを引き起こすので、この方がタイプミスに強い。
- これはプログラマーによっては少し厄介に見えるかもしれないが、まったく問題ない。どちらの方法を使うかは、個人的な好みと、if (ptr = NULL)エラーを検出するコンパイラの能力によります。
-
変数が真かどうかをテストする。単純な if (ptr) は ptr が TRUE かどうかをテストします。多くの場合、この違いは重要ではありませんが、すべてのアーキテクチャで同じではないことに注意してください。
- この逆は if (!ptr) で、これは ptr が FALSE の場合に TRUE を返します。
間違いを避ける
-
NULLをチェックする前にポインタをセットする。よくある間違いの1つは、新しく生成されたポインタがNULL値を持っていると思い込むことです。これは真実ではありません。未割り当てのポインタはまだメモリ・アドレスを指しています。新しく作成されたポインタや新しく解放されたポインタをNULLに設定するのは、誤ってこの役に立たないアドレスを使わないようにするための一般的な習慣です。
-
この間違いを避けるために
char *ptr;
if(ptr == NULL)
{
//これはFALSEを返します。ポインタには有効な値が割り当てられています。
} -
代わりに書く:
char *ptr = NULL; //ポインタにNULLを代入する。
if(ptr == NULL)
{
//ポインタが再割り当てされていなければTRUEを返す。
}
-
この間違いを避けるために
-
NULLを返す可能性のある関数に注意してください。関数がNULLを返す可能性がある場合、その可能性があるかどうか、そしてそれがコードの後半で問題を引き起こすかどうかを考えてください。以下は、malloc関数がNULLチェック(if (ptr))を使用して、有効な値を持つポインタのみを処理するようにした例です:
- int *ptr = malloc(N * sizeof(int));
int *ptr = malloc(N * sizeof(int)); if (ptr) { if (ptr)
int i;
for (i = 0; i < N; ++i)
ptr[i] = i;
}
- int *ptr = malloc(N * sizeof(int));
-
NULLは0であることを理解するが、ポインターを扱うときは常に0ではなくNULLを使うべきである。歴史的に、CはNULLを数字の0(つまり0x00)として表現してきた。現在では少し複雑になり、オペレーティング・システムによって異なります。通常は ptr == 0 を使って NULL をチェックすることができますが、これが問題になるケースもあります。おそらくもっと重要なことは、NULLを使うことで、他の人があなたのコードを読むときに、あなたがポインタを扱っていることが一目瞭然になるということです。
コメント
最新を表示する
NG表示方式
NGID一覧