初始化变量和带有NULL或0的指针之间是否存在差异?

时间:2016-01-12 21:48:18

标签: c variables pointers initialization null-pointer

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

int x = 0;
int x = NULL;

指针怎么样?我被告知有关NULL的不和谐的事情,例如:“NULL最适合初始化指针”或“不要使用NULL而是0来初始化变量”等等。现在,我在网上看到NULL等于0,我自己测试了一下。那有什么意义呢?为什么有些人说使用NULL不是一个好选择?有什么东西我不见了吗?

7 个答案:

答案 0 :(得分:5)

NULL是一个指针常量。您可以使用它来初始化一个指向不指向任何内容的值的指针。

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

#define NULL ((void *)0)

但是不能保证这一点。

答案 1 :(得分:3)

  

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

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

指针怎么样?

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

NULL等于0

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

如果NULL始终等于0,那么在C中就不需要它。

NULL一个空指针辅音 - 它经常,但并不总是有一个零位模式。具有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;
}

答案 2 :(得分:2)

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

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

  

NULL
  它扩展为实现定义的空指针常量。

和C中的空指针常量,章节§6.3.2.3

  

具有值0的整型常量表达式,或者此类表达式转换为类型   void *被称为空指针常量。[...]

所以,类型是指针的类型。

对于其他非指针变量,您应该使用0。

答案 3 :(得分:1)

不要使用NULL来初始化非指针类型,因为可能扩展为(void *) 0,具体取决于实现。对于整数类型,使用普通0(或一个宏或const - 限定变量,其值为0})。

答案 4 :(得分:1)

当您初始化(或比较)指针时,绝对使用NULL;这是一种很好的风格。

当你使用整数时,绝对不要使用NULL;它的风格很差(而且很可能不起作用。)

请不要聆听任何人建议您不应该使用NULL指针;他们可能很困惑。

有关详细信息,请参阅http://c-faq.com/null/index.html上的C FAQ列表。

答案 5 :(得分:-1)

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

答案 6 :(得分:-1)

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

有关受影响机器的详细信息,请参阅this answer其他问题。