だからあなたがするなら:
void *ptr = NULL;
そのvoidポインターがNULLかどうかを確認する最良の方法は何ですか?
今のところ私の回避策はこれです:
if (*(void**)ptr == NULL) ...
しかし、ptrの型がvoid **(そうではない)であると暗黙的に想定しているため、これは最良の方法のようには見えません。
私は単にif (!ptr)
と書きます。
NULL
は基本的に0
および!0
はtrueです。
NULLの定義を必ず含めてください。
#include <stddef.h>
void *X = NULL;
// do stuff
if (X != NULL) // etc.
<stdio.h>
などを含めると、stddef.h
が自動的に取得されます。
最後に、stddef.h
のNULLの定義を見るのは興味深いです。これを行うことにより、何をすべきかについての最初の推測が興味深い理由がわかります。
NULLポインターは、どこも指していないポインターです。その値は通常、次のように_stddef.h
_で定義されます。
_#define NULL ((void*) 0)
_
または
_#define NULL 0
_
NULLはゼロなので、ポインターがNULLかどうかをチェックするif
ステートメントは、そのポインターがゼロかどうかをチェックしています。したがって、ポインタがNULLでない場合、if (ptr)
は1と評価され、逆に、ポインタがNULLの場合、if (!ptr)
は1と評価されます。
あなたのアプローチif (*(void**)ptr == NULL)
はvoid
ポインターをポインターへのポインターとしてキャストし、それを逆参照しようとします。逆参照されたポインターツーポインターはポインターを生成するため、有効なアプローチのように思えるかもしれません。ただし、ptr
はNULLであるため、逆参照すると、未定義の動作が発生します。
if (ptr == NULL)
、または簡潔な表記を使用してif (!ptr)
をチェックする方がはるかに簡単です。
void *ptr = NULL
を割り当てるときにコードがコンパイルされた場合、特にif
であるため、それがNULL
であるかどうかを比較する単純なNULL
ステートメントで十分なはずです。コードをコンパイルできる場合は、_を定義する必要があります。
チェックする十分な方法の例:
if(ptr==NULL)
{
rest of code...
}
Linuxでgccを使用してコンパイルした小さなテストプログラムを作成しました。
int main()
{
void *ptr = NULL;
if(ptr==NULL)
{
return 1;
}
return 0;
}
これは少し古い投稿ですが、役に立つかもしれないものを追加したかったのです。
普段はこんな感じで
これは私の機能です。
void MyMethod( const void* l_pData ///< Source data
, size_t l_nLen /**< Number of bytes to convert */) {
// Return if nothing is provided
if (l_pData == NULL || ((const char*)(l_pData))[0] == '\0' || 0 == l_nLen) {
return;
}
// Rest of the code
}
あなたはチェックすることができます
- Null data
- Empty data
- Invalid length
以下が検証されます
MyMethod("", 10);
MyMethod(" ", 10);
MyMethod(NULL, 10);
MyMethod("valid", 0);