在C和C ++中为NULL / false,大于0x0 / 0b0 /'\ 0'/ 0

时间:2013-03-25 13:29:55

标签: c++ c null

正如问题所述,我一直在使用NULL和false(在C ++中)与0或0x0交替使用,依此类推。我很想知道除了是0的同义词之外,它们是否具有任何特殊意义。

6 个答案:

答案 0 :(得分:5)

对于某些平台NULL不是0x0


来自Is NULL in C required/defined to be zero?

NULL保证为零,可能会投放到(void *) 1

C99,§6.3.2.3,¶3

  

具有值0的整型常量表达式,或者此类表达式转换为类型   void *,称为空指针常量。(55)如果将空指针常量转换为a   指针类型,结果指针,称为空指针,保证比较不等   指向任何对象或函数的指针。

并注意55:

  

55)宏NULL在<stddef.h>(和其他标题)中定义为空指针常量。

请注意,由于如何制定空指针的规则,用于分配/比较空指针的值保证为零,但实际存储在指针内的位模式可以是任何其他东西(但AFAIK)只有少数非常深奥的平台利用了这个事实,这不应该是一个问题,因为要“看到”你应该进入UB - 土地的基础位模式。


因此,就标准而言,这两种形式是等价的(!ptr相当于ptr==0,因为§6.5.3.3¶5,而ptr==0相当于ptr==NULL); if(!ptr)也非常惯用。

话虽如此,我通常会明确地写if(ptr==NULL)而不是if(!ptr),以使我更清楚地知道我正在检查指针是否为无效而不是某个布尔值。


  1. 请注意,在C ++中,void *强制转换不能出现,因为更严格的隐式强制转换规则会使这种NULL的使用变得繁琐(您必须将其显式转换为比较指针的类型)每一次)。

答案 1 :(得分:3)

嗯,NULL可能不是零,它通常是。它取决于您的平台 - 这里有一些非零examples非零NULL机器。

答案 2 :(得分:1)

通常在C++中,您不应使用NULL。在C中,NULL(void*)0的宏,而在C++中,您应该使用0代替NULL。但是你不能使用false而不是0作为指针!除此之外,它们实际上是相同的,有时会造成混乱 这就是为什么在C++11nullptr被定义为用于指针的原因。

答案 3 :(得分:1)

NULL在指针中有广泛的意义。很可能一个声明为NULL的指针是无法引用的东西,但只能分配一些东西。而0或0x0可以是指针的值,可以引用和分配。

答案 4 :(得分:0)

来自linux内核stddef.h

#define NULL ((void *)0)

enum {
        false   = 0,
        true    = 1
};

所以它不完全是false

即使this发布声明为NULL0x0false几乎相同。

答案 5 :(得分:0)

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

在现代C ++中,它可以是nullptr而不是。

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