4

如问题中所述,我一直在使用 NULL 和 false(在 C++ 中)与 0 或 0x0 等互换。我很想知道它们是否具有除 0 的同义词之外的任何特殊含义。

4

6 回答 6

7

对于某些平台NULL不是0x0


C 中的 NULL 是否需要/定义为零?

NULL保证为零,也许被强制转换为(void *)1

C99,§6.3.2.3,¶3

具有 value 的整数常量表达式0,或转换为 type 的表达式 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变得繁琐(您每次都必须将其显式转换为比较指针的类型),因此不能存在转换。
于 2013-03-25T13:32:19.120 回答
3

好吧,NULL 可能不是零,它通常是。它取决于您的平台——这里有一些非零 NULL 机器的讨厌的例子。

于 2013-03-25T13:32:30.833 回答
1

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

于 2013-03-25T13:32:43.253 回答
1

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

于 2013-03-25T13:34:22.147 回答
0

来自 linux 内核stddef.h

#define NULL ((void *)0)

enum {
        false   = 0,
        true    = 1
};

所以不完全是false

即使这篇文章声称它是NULL0x0并且false几乎相同。

于 2013-03-25T13:35:34.013 回答
0

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

在现代 C++ 中,它可以是任何一个nullptr

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

于 2013-03-25T13:39:59.493 回答