有时,人们会读到较旧的C编译器的NULL
定义不是0
或(void *)0
。我对C标准的理解是,即使平台的空指针的位模式非零,对指针(隐式或显式)的整数0仍然是空指针,并在内部存储为平台的空指针位图案。
但是,例如,here写的是:
在一些较旧的C编译器中,
NULL
被不同地定义为一些奇怪的东西,所以你必须更加小心。
我记得不时在其他地方读这篇文章。除非这是一个持久的城市传说,否则NULL
的其他定义还在使用中?
答案 0 :(得分:1)
当你说空指针常量(常量整数零或常量整数零转换为void *
)保证被正确转换为目标类型的空指针的适当内部表示时,你是绝对正确的。这意味着不需要NULL
的任何其他定义。 0
或(void *) 0
可以在任何地方使用。
然而,与此同时,C语言的早期版本没有提供这样的保证,也没有标准的NULL
宏。为指针变量分配一个整数值会导致指针字面上指向该整数值表示的地址。将常量0
分配给指针只会使其指向地址0
。如果用户希望在他们的程序中有一个保留指针值,他们必须手动选择一个“一次性”地址用于此目的。
宏语NULL
很有可能在语言标准化之前和上述零指针转换规则出现之前进入非正式用法。那时NULL
必须被定义为表示精确保留地址的整数值。例如。想要将地址0xBAADFOOD
用于空指针的预标准C实现将NULL
定义为0xBAADFOOD
。我无法确认这一点,因为我不知道宏NULL
何时首次出现在“野外”。
答案 1 :(得分:0)
你绝对正确。
其中一个奇怪的东西"你可能遇到的是#define'对((void *)0)
的NULL,这会导致代码使用NULL作为指针失败的任何东西。
以下是其他一些变体:
http://www.tutorialspoint.com/c_standard_library/c_macro_null.htm
#define NULL ((char *)0)
或
#define NULL 0L
或
#define NULL 0
值得注意的是,C ++ 11引入了nullptr
来提供类型安全的消除NULL,0等的消歧。请参阅Much Ado about Nothing或(http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1601.pdf