使用 NULL 或 0 初始化变量和指针之间有区别吗?

Is there a difference between initialiazing variables and pointers with NULL or 0?

下面哪种初始化变量的方法更正确?

int x = 0;
int x = NULL;

指针呢?有人告诉我关于 NULL 的不和谐的事情,例如:“NULL 最适合初始化指针”或 "Don't use NULL but 0 to initialize a variable" 等等......现在,我在互联网上读到 NULL 等于 0 我自己测试过。那么有什么意义呢?为什么有些人说使用 NULL 不是一个好的选择?有什么我想念的吗?

NULL 是一个 null-pointer 常量。您应该使用它来初始化指针类型。

来自 C11,章节 §7.19,stddef.h

NULL
which expands to an implementation-defined null pointer constant.

和 C 中的 null-pointer 常量,第 §6.3.2.3 章

An integer constant expression with the value 0, or such an expression cast to type void *, is called a null pointer constant.[...]

所以,类型是指针。

对于其他 non-pointer 变量,您应该使用 0。

NULL 是一个指针常量。您使用它来初始化一个指向一个值的指针,该值表示它不指向任何东西。

在大多数 C 实现中,它被定义为:

#define NULL ((void *)0)

但这并不能保证。

理论上NULL可以是指向不同于0的地址的指针。但在实践中,这样的定义会使大部分软件崩溃。在 99.99% 的情况下它是 0(或 (void *)0)。

部署了一些are/were NULL 不是 零的架构:Prime 50、Honeywell-Bull、CDC Cyber​​ 180 系列等。在这些情况下,NULL 绝对不能与零互换。

有关受影响的机器的详细信息,请参见另一个问题 this answer

不要使用 NULL 来初始化 non-pointer 类型,因为它 可能 扩展为类似 (void *) 0 的东西,具体取决于实现。对整数类型使用普通 0(或计算为普通 0 的宏或 const 限定变量)。

Which of the following methods is a more correct way to initialize a variable?

// int x = NULL;  `NULL` implies pointer
int x = 0;        // 0 implies integer value and x is an integer.

What about the pointers?

void *p = NULL;  // `NULL` implies pointer and p is a pointer.
//void *p = 0;   // 0 implies integer value

that NULL is equal to 0

它在值上是相等的,尽管在位模式上可能不同。请参阅下面的 +0.0, -0.0 示例。


如果 NULL 总是等于 0,那么在 C 中就不需要它了。

NULLa 空指针辅音 - 它经常但并不总是具有零的位模式。具有 NULL 值的指针将始终与 0 进行比较:相同的值,不同的位模式。

请记住,== 比较值,而不是位模式。

void *a = NULL;
if (a == NULL) Always_True();
if (a == 0) Always_True();

可能有帮助的示例。 +0.0-0.0 具有相同的值、相同的类型,但位模式不同。指针可能会发生类似的事情。

int main(void) {
  double pz = +0.0;
  double nz = -0.0;
  printf("=:%d  bits:%d\n", pz == nz, memcmp(&pz, &nz, sizeof pz) == 0);  // =:1  bits:0
  return 0;
}

在初始化(或比较)指针时一定要使用NULL;风格不错

在处理整数时绝对不要使用 NULL;风格很差(而且很可能行不通。)

不要听信任何人建议您不应该将 NULL 与指针一起使用;他们可能很困惑。

有关详细信息,请参阅 http://c-faq.com/null/index.html 中的 C 常见问题解答列表。