首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在C中取消引用指向0的指针

在C中取消引用指向0的指针
EN

Stack Overflow用户
提问于 2014-01-14 09:42:53
回答 5查看 6K关注 0票数 55

有时,内存地址0x0处的数据非常有价值--以x86实数模式IVT为例:它从0x0处开始,并包含指向中断处理程序的指针: 0x00处的dword是指向除以零错误处理程序的指针。

然而,C11语言标准禁止取消引用空指针[WG14 N1570 6.5.3.2],空指针被定义为用0初始化的指针或用空指针初始化的指针[WG14 N1570 6.3.2.3],有效地禁止了第一个字节。

人们是如何在需要的时候使用0x0的呢?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2014-01-14 09:56:10

C并不禁止取消对空指针的引用,它只是使其成为未定义的行为。

如果您的环境能够取消对包含地址0x0的指针的引用,那么您应该能够这样做。C语言标准没有说明当你这样做时会发生什么。(在大多数环境中,结果将是程序崩溃。)

一个具体的例子(如果我没记错的话):在基于68k的Sun3计算机上,取消引用null指针不会导致陷阱;相反,操作系统在内存地址零存储零值,而取消引用null指针(指向地址零)将产生该零值。例如,这意味着C程序可以将空指针视为指向空字符串的有效指针。有些软件,不管是有意还是无意,都依赖于这种行为。在将软件移植到基于SPARC的Sun4上时,这需要大量的清理工作,这会陷入空指针引用的陷阱。(我清楚地记得我读过这个,但我找不到参考资料;如果我能找到,我会更新这篇文章。)

请注意,空指针不一定是地址零。更准确地说,null的表示可以是也可以不是全位零。这是非常普遍的,但这是不保证的。(如果不是,则(void*)0的整数到指针的转换不是微不足道的。)

comp.lang.c FAQ的第5节讨论了空指针。

票数 47
EN

Stack Overflow用户

发布于 2014-01-14 09:58:41

人们到底是如何在需要的时候使用0x0的呢?

通过以下两种方式之一:

  • 用汇编语言编写所需的代码,或
  • 用C编写代码并验证他们的编译器是否为所需的操作生成正确的汇编语言
票数 19
EN

Stack Overflow用户

发布于 2014-01-14 10:23:58

声明:

char * x = 0;

不一定将0x0放入x。它将为当前体系结构和编译器定义的空指针值放入x。

现在,实际上,所有常用的编译器/处理器最终都会在寄存器或存储位置的一行中放置32 (或64)个0位来响应该语句,因此,如果内存地址0是有用的,那么,正如其他人所指出的那样,您将使用正式未定义的行为。然而,曾几何时,有一种硬件,它的“空指针”是一些不全为零的位模式,谁知道呢,可能还会有这种情况。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21104702

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档