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

8

因此,如果您执行以下操作:

void *ptr = NULL;

如何最好地检查空指针?

目前我的解决方法是:

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

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


为什么要这么大惊小怪呢? - Uchia Itachi
1
解决什么问题的变通方法? - GManNickG
1
不清楚你想做什么。你的 ptr 不是指向一个空指针,它本身就是一个空指针。空指针不指向任何对象,对其进行解引用是未定义行为。 - n. m.
如果 ptr 是 NULL,在进行类型转换后它仍然是 NULL,对其进行解引用是未定义的行为。 - Akib Azmain Turja
5个回答

14

我会简单地写成if (!ptr)

NULL基本上就是0,而!0是真。


2
并非在所有架构上,您将编写不可移植的代码。可能是在使用段寻址的286处理器上,NULL != 0,但那已经是几十年前的事情了。 - fadedbee
3
我会将ptr与NULL进行比较,就像ptr == NULL一样。不能保证NULL等于0。 - jacekmigacz
这种方法在现代机器中是否可行? - Himanshu Shekhar
1
@jacekmigacz 这没有任何区别。ptr == NULLptr == 0!ptr相同。即使实现使用的NULL不是所有位都为零,仍然保证编译器会使上述三个行为相同。 - user694733

6
请务必包含NULL的定义。
   #include <stddef.h>

   void  *X = NULL;

   // do stuff

   if (X != NULL)  // etc.

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

最后,有趣的是查看stddef.h中NULL的定义,通过这样做,您将了解为什么您最初的猜想很有趣。


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

@EricPostpischil,您当然是正确的,我已经进行了编辑。感谢您的纠正。 - verbose

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

1
没有为定义NULL的几个标准头文件之一包含#include,代码将无法编译。 - Keith Thompson

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

1
这是一个C语言问题。C语言没有reinterpret_cast - user694733

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接