有时,内存地址0x0处的数据非常有价值--以x86实数模式IVT为例:它从0x0处开始,并包含指向中断处理程序的指针: 0x00处的dword是指向除以零错误处理程序的指针。
然而,C11语言标准禁止取消引用空指针[WG14 N1570 6.5.3.2],空指针被定义为用0初始化的指针或用空指针初始化的指针[WG14 N1570 6.3.2.3],有效地禁止了第一个字节。
人们是如何在需要的时候使用0x0的呢?
发布于 2014-01-14 09:56:10
C并不禁止取消对空指针的引用,它只是使其成为未定义的行为。
如果您的环境能够取消对包含地址0x0
的指针的引用,那么您应该能够这样做。C语言标准没有说明当你这样做时会发生什么。(在大多数环境中,结果将是程序崩溃。)
一个具体的例子(如果我没记错的话):在基于68k的Sun3计算机上,取消引用null指针不会导致陷阱;相反,操作系统在内存地址零存储零值,而取消引用null指针(指向地址零)将产生该零值。例如,这意味着C程序可以将空指针视为指向空字符串的有效指针。有些软件,不管是有意还是无意,都依赖于这种行为。在将软件移植到基于SPARC的Sun4上时,这需要大量的清理工作,这会陷入空指针引用的陷阱。(我清楚地记得我读过这个,但我找不到参考资料;如果我能找到,我会更新这篇文章。)
请注意,空指针不一定是地址零。更准确地说,null的表示可以是也可以不是全位零。这是非常普遍的,但这是不保证的。(如果不是,则(void*)0
的整数到指针的转换不是微不足道的。)
comp.lang.c FAQ的第5节讨论了空指针。
发布于 2014-01-14 09:58:41
人们到底是如何在需要的时候使用0x0的呢?
通过以下两种方式之一:
发布于 2014-01-14 10:23:58
声明:
char * x = 0;
不一定将0x0放入x。它将为当前体系结构和编译器定义的空指针值放入x。
现在,实际上,所有常用的编译器/处理器最终都会在寄存器或存储位置的一行中放置32 (或64)个0位来响应该语句,因此,如果内存地址0是有用的,那么,正如其他人所指出的那样,您将使用正式未定义的行为。然而,曾几何时,有一种硬件,它的“空指针”是一些不全为零的位模式,谁知道呢,可能还会有这种情况。
https://stackoverflow.com/questions/21104702
复制相似问题