因此,如果您执行以下操作:
void *ptr = NULL;
如何最好地检查空指针?
目前我的解决方法是:
if (*(void**)ptr == NULL) ...
但这似乎不是最好的方法,因为我隐含地假设ptr是void **类型(实际上它并不是)。
因此,如果您执行以下操作:
void *ptr = NULL;
如何最好地检查空指针?
目前我的解决方法是:
if (*(void**)ptr == NULL) ...
但这似乎不是最好的方法,因为我隐含地假设ptr是void **类型(实际上它并不是)。
我会简单地写成if (!ptr)
。
NULL
基本上就是0
,而!0
是真。
ptr == NULL
与ptr == 0
与!ptr
相同。即使实现使用的NULL不是所有位都为零,仍然保证编译器会使上述三个行为相同。 - user694733 #include <stddef.h>
void *X = NULL;
// do stuff
if (X != NULL) // etc.
如果您包含<stdio.h>
和类似的内容,则stddef.h
会自动引入。
最后,有趣的是查看stddef.h
中NULL的定义,通过这样做,您将了解为什么您最初的猜想很有趣。
NULL指针是一个没有指向任何位置的指针。它的值通常在stddef.h
中定义如下:
#define NULL ((void*) 0)
或者
#define NULL 0
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;
}
NULL
的几个标准头文件之一包含#include
,代码将无法编译。 - Keith Thompson我知道这是一个有点旧的帖子,但想要添加一些可能会有用的东西。
通常我会做类似于这样的事情:
这是我的函数。
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);
reinterpret_cast
。 - user694733
if(pointer)
代替if(pointer != NULL)
吗? - Grijesh Chauhanptr
不是指向一个空指针,它本身就是一个空指针。空指针不指向任何对象,对其进行解引用是未定义行为。 - n. m.ptr
是 NULL,在进行类型转换后它仍然是 NULL,对其进行解引用是未定义的行为。 - Akib Azmain Turja