【问题标题】:How to check if void pointer points to NULL?如何检查void指针是否指向NULL?
【发布时间】:2013-08-20 04:56:45
【问题描述】:

如果你这样做:

void *ptr = NULL;

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

我现在的解决方法是:

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

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

【问题讨论】:

  • 何必大惊小怪
  • what 的解决方法?
  • 不清楚您要做什么。您的ptr 没有指向 空指针,它 空指针。空指针不指向任何对象,取消引用它是 UB。
  • 如果 ptr 为 NULL,则在转换后仍为 NULL,并且取消引用它是未定义的行为。

标签: c pointers void-pointers


【解决方案1】:

我只想写if (!ptr)

NULL 基本上只是0!0 是真的。

【讨论】:

  • 并非在所有架构上,您都将编写不可移植的代码。可能是 286,当使用段寻址时,NULL != 0,但那是几十年前的事了。
  • 我会将 ptr 与 NULL 进行比较;像 ptr == NULL。不能保证 NULL 等于 0。
  • 这种方法在当今世界是否可取,现代机器?
  • @jacekmigacz 这没什么区别。 ptr == NULLptr == 0 相同 与 !ptr 相同。即使实现使用并非所有位为零的 NULL,仍然可以保证编译器将使上述所有三个行为相同。
【解决方案2】:

确保包含 NULL 的定义。

   #include <stddef.h>

   void  *X = NULL;

   // do stuff

   if (X != NULL)  // etc.

如果你包含&lt;stdio.h&gt; 和类似的,那么stddef.h 会自动加入。

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

【讨论】:

    【解决方案3】:

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

    #define NULL ((void*) 0)
    

    #define NULL 0
    

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

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

    检查if (ptr == NULL) 或使用简洁的符号if (!ptr) 要简单得多。

    【讨论】:

    • @EricPostpischil 你当然是对的,我已经进行了相应的编辑。谢谢指正。
    【解决方案4】:

    如果您的代码在分配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 就无法编译。
    【解决方案5】:

    我知道这是一个有点旧的帖子,但想添加一些可能有用的东西。

    我通常做的是这样的,

    这是我的功能。

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

    【讨论】:

    • 这是 C 题。 C 没有reinterpret_cast
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-05
    • 2011-06-07
    • 2020-03-29
    • 1970-01-01
    • 2014-01-01
    • 2023-03-28
    相关资源
    最近更新 更多