所以如果你这样做:
void *ptr = NULL;
检查 void 指针是否为 NULL 的最佳方法是什么?
我现在的解决方法是:
if (*(void**)ptr == NULL) ...
但这似乎不是最好的方法,因为我隐含地假设 ptr 是 void** 类型(它不是)。
所以如果你这样做:
void *ptr = NULL;
检查 void 指针是否为 NULL 的最佳方法是什么?
我现在的解决方法是:
if (*(void**)ptr == NULL) ...
但这似乎不是最好的方法,因为我隐含地假设 ptr 是 void** 类型(它不是)。
我只想写if (!ptr)
。
NULL
基本上是公正的0
并且!0
是真实的。
请务必包含 NULL 的定义。
#include <stddef.h>
void *X = NULL;
// do stuff
if (X != NULL) // etc.
如果您包含<stdio.h>
和类似内容stddef.h
,则会自动加入。
最后,看看 NULL 的定义是很有趣的stddef.h
,通过这样做你会明白为什么你最初的猜测是有趣的。
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)
。
如果您的代码在分配时设法编译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;
}
我知道这是一个有点旧的帖子,但想添加一些可能有用的东西。
我通常做的事情是这样的,
这是我的功能。
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);