有时内存地址 0x0 处的数据非常有值(value)——以 x86 实模式 IVT 为例:它从 0x0 开始并包含指向中断处理程序的指针:0x00 处的 dword 是指向除以零错误处理程序的指针。
但是,C11 语言标准禁止取消引用空指针 [WG14 N1570 6.5.3.2],定义为用0初始化的指针或用空指针初始化的指针[WG14 N1570 6.3.2.3],有效地禁止了第一个字节。
人们如何在需要时实际使用 0x0?
最佳答案
C 不禁止取消引用空指针,它只是使它成为未定义的行为。
如果您的环境能够取消引用包含地址 0x0
的指针,那么您应该能够这样做。 C 语言标准没有说明这样做时会发生什么。 (在大多数环境中,结果将是程序崩溃。)
一个具体的例子(如果我没记错的话):在基于 68k 的 Sun 3 计算机上,取消引用空指针不会导致陷阱;相反,操作系统将零值存储在内存地址零处,并且取消引用空指针(指向地址零)将产生该零值。这意味着,例如,C 程序可以将空指针视为指向空字符串的有效指针。某些软件有意或无意地依赖于这种行为。在将软件移植到基于 SPARC 的 Sun 4 时,这需要大量的清理工作,这会陷入空指针取消引用。 (我清楚地记得读过这篇文章,但我找不到引用资料;如果我能找到它,我会更新它。)
注意,空指针不一定地址为零。更准确地说,空值的表示可能是也可能不是全位为零。它很常见,但不能保证。 (如果不是,那么 (void*)0
的整数到指针的转换是不平凡的。)
comp.lang.c FAQ 的第 5 节讨论空指针。
关于c - 在 C 中取消引用指向 0 的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21104702/