NULL总是假?
假设在C中NULL
总是转化为假是否安全?
void *somePtr = NULL; if (!somePtr) { /* This will always be executed? */ }
或者应该显式检查NULL
的值吗?
是。 NULL的计算结果为false,因为C认为任何非零值true和任何零值false。 NULL本质上是zero
地址,并作为比较对待,我相信会被提升为一个int为布尔检查。 我希望你的代码对于熟悉C的人来说是可读的,尽pipe我可能会明确地检查它。
在C和C ++编程中,两个空指针保证比较相等; ANSI C保证任何空指针在与整数types的比较中将等于0; 此外,macrosNULL被定义为一个空指针常量,即值0(作为整数types或转换为指向void的指针),所以空指针将等于NULL。
参考: http : //en.wikipedia.org/wiki/Null_pointer#Null_pointer
假设任何事情都是不安全的。
明确的检查也更清楚你正在testing什么。
'C'语言来自于(void *)0实际上可以是有效指针的时代。 不久以前,8080和Z80微处理器在地址0处有一个中断向量。面对这样的架构select,除了让一个头文件声明NULL的值之外,它什么也做不了。 有一些编译器在那里,现在已经被遗忘,其中NULL不等于(void *)0(0xffff是下一个select),因此给你的if()语句未定义的行为。
C ++仁慈地结束了这个,一个空指针可以从0赋值并且可以被testing。
是的(至less对于任何符合标准的C编译器!)
从comp.lang.c FAQ :
问:是否缩写指针比较“if(p)”来testing非空指针是否有效? 如果空指针的内部表示是非零的呢?
答:这总是有效的。
NULL只是一个预处理器的定义。 它在stdio.h中。 通常情况下,只有一个疯狂的人会重新定义它,但这是可能的。 一个例子:
#include <stdio.h> #ifdef NULL #undef NULL #define NULL 1 #endif void main() { if (NULL) printf("NULL is true\n"); else printf("NULL is false\n"); }
此代码将打印“NULL是真实的”。 试试看,如果你不相信我。 你的编译器可能甚至不会警告你,你正在做一些奇怪的事情。
NULL
被定义为一个常量指针,保证指向内存中无用/不存在的地方。 NULL
大部分实现都是((void *)0)
但这并不是必须的。
我只是把你介绍给C-FAQ的问题5.3 。 它回答了这个确切的问题。
是的,主要是。
首先,NULL是一个typedef。 我可以通过在之前包含的标题中说出你的意见
#define NULL 1
这可能没有什么意义,但是从什么时候开始有别人的代码有意义呢? 🙂
另外,虽然它可能在语法上安全,但它在语义上不正确。 NULL表示“无”,既不是真或假,也不是一个布尔值或整数或string。 这意味着“无为的象征”。 因此,对NULL进行testing更像是一个哲学问题:如果一棵树落在森林中,而if(listener)
,是否发出声音?
请大家帮忙,并清楚testingNULL。
* NULL总是以0x00L为目标。 你可以认为这是错误的,但要确保总是做一个明确的检查。