所以,如果你这样做:
void *ptr = NULL;
检查该void指针是否为NULL的最佳方法是什么?
我现在的解决方法是:
if (*(void**)ptr == NULL) ...
但这似乎不是最好的方法,因为我暗示假设ptr是void **类型(它不是)。
答案 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);