【问题标题】:is NULL/false in C and C++ anything more than 0x0 / 0b0 / '\0' / 0 [duplicate]在 C 和 C++ 中为 NULL/false 超过 0x0 / 0b0 / '\0' / 0 [重复]
【发布时间】:2013-03-15 00:21:51
【问题描述】:

正如问题中提到的,我一直在使用 NULL 和 false(在 C++ 中)与 0 或 0x0 等互换。我很想知道它们除了作为 0 的同义词之外是否还有其他特殊含义。

【问题讨论】:

标签: c++ c null


【解决方案1】:

对于某些平台NULL 不是0x0


来自Is NULL in C required/defined to be zero?

NULL 保证为零,可能被转换为(void *)1

C99,§6.3.2.3,¶3

具有值0 的整数常量表达式,或转换为类型的此类表达式 void *,称为空指针常量。(55) 如果将空指针常量转换为 指针类型,结果指针,称为空指针,保证比较不相等 指向任何对象或函数的指针。

注释 55 说:

55) 宏 NULL 在<stddef.h>(和其他头文件)中定义为空指针常量。

请注意,由于空指针规则的制定方式,您用于分配/比较空指针的值保证为零,但实际存储在指针内的位模式可以是任何其他东西(但 AFAIK只有少数非常深奥的平台利用了这一事实,无论如何这应该不是问题,因为要“看到”底层位模式,无论如何你都应该进入UB-land)。


因此,就标准而言,这两种形式是等价的(!ptr 等价于ptr==0,由于§6.5.3.3 ¶5,ptr==0 等价于ptr==NULL); if(!ptr) 也很地道。

话虽如此,我通常明确写 if(ptr==NULL) 而不是 if(!ptr) 以更清楚地表明我正在检查指针是否为空而不是某个布尔值。


  1. 请注意,在 C++ 中,void * 转换不能存在,因为更严格的隐式转换规则会使此类 NULL 的使用变得繁琐(您必须每次都将其显式转换为比较指针的类型)。

【讨论】:

【解决方案2】:

嗯,NULL 可能不是零,它通常是。这取决于您的平台 - 这里有一些讨厌的 examples 非零 NULL 机器。

【讨论】:

  • 空指针的地址不能有数值零;但零值整数常量仍将转换为空指针。
【解决方案3】:

NULL 在指针中具有广泛的意义。最有可能声明为 NULL 的指针是不能被引用但可以被分配的东西。而 0 或 0x0 可以是指针的值,既可以引用也可以赋值。

【讨论】:

    【解决方案4】:

    一般在C++ 中你不应该使用NULL。在C 中,NULL(void*)0 的宏,而在C++ 中,您应该使用0 而不是NULL。但是你不能使用false 代替0 来作为指针!除此之外,它们实际上是相同的,有时会引起混淆。
    这就是为什么在 C++11 中,nullptr 被定义为用于指针。

    【讨论】:

    • @LuchianGrigore 是的,你是对的!谢谢
    【解决方案5】:

    在 C 和历史悠久的 C++ 中,NULL 必须是一个零值整数常量,通常是 0。我认为 C 可以包含对 void* 的显式转换,但 C++ 不能,因为该语言不允许从 void* 到其他指针类型的隐式转换。

    在现代 C++ 中,它可以是 nullptr

    在任何一种情况下,任何零值整数常量(包括诸如 '\0'false 之类的奇数)都可以转换为空指针值。

    【讨论】:

      【解决方案6】:

      来自linux内核stddef.h

      #define NULL ((void *)0)
      
      enum {
              false   = 0,
              true    = 1
      };
      

      所以不完全是false

      尽管 this 帖子声称它是 NULL0x0false 几乎相同。

      【讨论】:

        猜你喜欢
        • 2016-06-18
        • 2017-02-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多