以下哪种方法是更正确的初始化变量的方法?
int x = 0;
int x = NULL;
指针怎么样?我被告知有关NULL
的不和谐的事情,例如:“NULL
最适合初始化指针”或“不要使用NULL
而是0来初始化变量”等等。现在,我在网上看到NULL
等于0,我自己测试了一下。那有什么意义呢?为什么有些人说使用NULL不是一个好选择?有什么东西我不见了吗?
答案 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其他问题。