7

所以如果你这样做:

void *ptr = NULL;

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

我现在的解决方法是:

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

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

4

5 回答 5

13

我只想写if (!ptr)

NULL基本上是公正的0并且!0是真实的。

于 2013-08-18T05:52:13.230 回答
6

请务必包含 NULL 的定义。

   #include <stddef.h>

   void  *X = NULL;

   // do stuff

   if (X != NULL)  // etc.

如果您包含<stdio.h>和类似内容stddef.h,则会自动加入。

最后,看看 NULL 的定义是很有趣的stddef.h,通过这样做你会明白为什么你最初的猜测是有趣的。

于 2013-08-18T06:00:37.033 回答
2

NULL 指针是一个不指向任何地方的指针。它的值通常定义stddef.h如下:

#define NULL ((void*) 0)

或者

#define NULL 0

由于 NULL 为零,if因此检查指针是否为 NULL 的语句是检查该指针是否为零。因此if (ptr),当指针不为 NULL 时计算为 1,反之,if (!ptr)当指针为 NULL 时计算为 1。

您的方法if (*(void**)ptr == NULL)void指针转换为指向指针的指针,然后尝试取消引用它。取消引用的指针指向指针会产生一个指针,因此它可能看起来是一种有效的方法。但是,由于ptr是 NULL,因此当您取消引用它时,您正在调用未定义的行为。

检查if (ptr == NULL)或使用简洁的表示法要简单得多if (!ptr)

于 2013-08-18T07:50:12.500 回答
1

如果您的代码在分配时设法编译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;
}
于 2013-08-19T03:39:50.883 回答
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);
于 2017-05-08T06:45:56.953 回答