根据中的答复“为什么要在 offsetof() 中减去空指针?”(以及我对 K&R 的阅读),C 标准并不要求这样做(size_t)((char *)0) == 0
。不过,我从未见过将空指针转换为整数类型会计算出其他值的情况。
如果有一个编译器或场景(size_t)((char *)0) != 0
, 它是什么?
嗯,如您所知,给定类型的空指针的物理表示不一定是全零位模式。当您强制将指针(任何指针)值转换为整数类型时,结果是实现定义的,但通常(这就是意图)指针的数值(数字地址)如果可能的话保持不变。这意味着如果在给定平台上,类型为空指针char *
表示为0xBAADF00D
模式(例如),上面的表达式将计算为0xBAADF00D
,并且不为零。当然,为此您需要一个具有非零空指针的平台。我个人从未使用过此类平台,尽管我听说过许多类似的真实平台(例如,在嵌入式平台领域,这并不罕见)。
此外,作为补充说明,不同类型的空指针值可以具有不同的物理表示,这意味着理论上您可以从(size_t) ((int *) 0)
, (size_t) ((char *) 0)
and (size_t) ((double *) 0)
。但这将是一种相当奇特的情况,尽管从抽象 C 语言的角度来看这是完全可能的。
附:读here(C FAQ)有关具有非零空指针的实际平台的一些示例。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)