使用 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 中就不需要它了。
NULL
是 a 空指针辅音 - 它经常但并不总是具有零的位模式。具有 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 常见问题解答列表。
下面哪种初始化变量的方法更正确?
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 typevoid *
, 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 中就不需要它了。
NULL
是 a 空指针辅音 - 它经常但并不总是具有零的位模式。具有 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 常见问题解答列表。