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

标签 c pointers memory dereference

有时内存地址 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/

相关文章:

c++ - 访问无限数组元素?

计算 0 到 90 之间的角度加 15

c - 不太确定,memcpy 上有段错误吗?

C计算器代码问题

r - 为小整数或级别少的因子节省存储空间

swift - SpriteKit 没有释放所有使用的内存

c - (C) 尝试将 .txt 文件读入二维数组(请注意,失败了!)

c - lfind 给出不一致的结果

c - 使用指针 : segmentation error 实现队列

c - 这段 C 代码是如何工作的?