web-dev-qa-db-ja.com

voidポインターがNULLを指しているかどうかを確認する方法

だからあなたがするなら:

void *ptr = NULL;

そのvoidポインターがNULLかどうかを確認する最良の方法は何ですか?

今のところ私の回避策はこれです:

if (*(void**)ptr == NULL) ... 

しかし、ptrの型がvoid **(そうではない)であると暗黙的に想定しているため、これは最良の方法のようには見えません。

7
pyrrhic

私は単にif (!ptr)と書きます。

NULLは基本的に0および!0はtrueです。

11
nmaier

NULLの定義を必ず含めてください。

   #include <stddef.h>

   void  *X = NULL;

   // do stuff

   if (X != NULL)  // etc.

<stdio.h>などを含めると、stddef.hが自動的に取得されます。

最後に、stddef.hのNULLの定義を見るのは興味深いです。これを行うことにより、何をすべきかについての最初の推測が興味深い理由がわかります。

6
JackCColeman

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)をチェックする方がはるかに簡単です。

2
verbose

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;
}
1
xt454

これは少し古い投稿ですが、役に立つかもしれないものを追加したかったのです。

普段はこんな感じで

これは私の機能です。

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);
0
SajithP