如何检查void指针是否指向NULL?

时间:2013-08-18 05:48:21

标签: c pointers void-pointers

所以,如果你这样做:

void *ptr = NULL;

检查该void指针是否为NULL的最佳方法是什么?

我现在的解决方法是:

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

但这似乎不是最好的方法,因为我暗示假设ptr是void **类型(它不是)。

5 个答案:

答案 0 :(得分:11)

我只想写if (!ptr)

NULL基本上只是0!0是真的。

答案 1 :(得分:6)

请务必包含NULL的定义。

   #include <stddef.h>

   void  *X = NULL;

   // do stuff

   if (X != NULL)  // etc.

如果您添加<stdio.h>类似内容,那么stddef.h会被自动拉入。

最后,在stddef.h中查看NULL的定义很有意思,通过这样做,您将看到为什么您最初的猜测是有趣的。

答案 2 :(得分:2)

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)检查要简单得多。

答案 3 :(得分:1)

如果您的代码在分配void *ptr = NULL时设法进行编译,那么如果if的{​​{1}}语句在NULL上进行比较就足够了,特别是因为{{1}如果代码可以编译,则必须定义。

检查的充分方法示例:

NULL

我写了一个小测试程序,用linux上的gcc编译,可以工作:

if(ptr==NULL)
{
    rest of code...
}

答案 4 :(得分: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);