Null是在计算中具有保留的值,用于指示指针不引用有效对象。程序通常使用空指针来表示条件,例如未知长度列表的结尾或未执行某些操作; 这种空指针的使用可以与可
空类型和选项类型中的Nothing值进行比较。
空字符通常表示为
源代码字符串字符或
字符常量中的
转义序列。在许多语言,这不是一个单独的转义序列,而是八进制转义序列,单个
八进制Unicode表示 。
表示空字符的能力并不总是意味着生成的字符串将被正确解释,因为许多程序将认为null作为字符串的结尾。因此,键入它的能力(在未经检查的用户输入的情况下)会创建一个称为空字节注入的漏洞,并可能导致
安全漏洞。
在文档中的空字符有时表示为单EM含有字母“NUL” -
width符号。在Unicode中,有一个具有相应字符的字符,用于空字符的可视表示,“null”符号,U + 2400(␀),但不要与实际的空字符U + 0000混淆。
在C中,任何类型的两个空指针都保证比较相等。
预处理器宏NULL被定义为实现定义的
空指针常量,它在
C99中可以可移植地表示为0隐式或
显式转换为类型的整数值
void*(指向void的指针)。C标准没有说空指针与指向
内存地址0 的指针相同,尽管在实践中可能就是这种情况。
解引用空指针是C中的
未定义行为,并且允许符合要求的实现假定任何被解除引用的指针不为空。
实际上,取消引用空指针可能会导致尝试从未映射的内存中读取或写入,从而触发分段错误或内存
访问冲突。这可能表现为程序崩溃,或者转换为可由程序代码捕获的软件异常。但是,在某些情况下并非如此。例如,在
x86实模式中,地址0000:0000是可读的并且通常也是可写的,并且取消引用指向该地址的指针是完全有效但通常不需要的操作,可能导致
应用程序中的未定义但非崩溃的行为。有时解除引用地址为零的指针是有意的、明确的;例如,用C语言编写的用于16位
实模式x86设备的
BIOS代码可以通过解除引用空指针来写入机器的
物理地址0处的
IDT。
编译器还可以优化掉空指针解除引用,避免分段错误但引起其他不希望的行为。
在C ++中,虽然继承了C的NULL宏,但
空指针常量优先解释为
整型0而不是指针值,这极容易导致某些错误。故C++ 11引入了一个显式
nullptr常量来代替。
NULL与0有着扯不断理还乱的关系,其实不那么高深。0本身有着一些原生的特性诸如:起始,没有,正负的
分界线,0/1中的0还可以表示否定。NULL正需要这些特性中的一部分。 只需要清楚NULL的本质,并在合理的地方才加以利用而非滥用。
NULL类型为 php 4 所引进,特殊的
NULL值表示一个变量没有值(NULL类型唯一可能的值就是NULL)。
表示对象o是一个空引用,如果程序员对它进行了引用,就会抛出一个
NullPointerException异常。
在所有现代字符集中,空字符的代码
点值为零。在大多数编码中,这被转换为具有零值的单个代码单元。例如在
UTF-8中,它是一个零字节。然而,在修改的UTF-8中,空字符被编码为两个字节:0xC0,0x80。这
允许值为零的字节(现在不用于任何字符)用作字符串
终结符。