(size_t)((char*)0)是否曾评估为0?

Bru*_*sen 5 c compiler-construction pointers casting standards-compliance

根据"为什么在offsetof()中减去空指针的响应?" (以及我对K&R的解读),C标准并不要求这样做(size_t)((char *)0) == 0.尽管如此,我还没有看到过将一个指向整数类型的空指针计算为其他任何东西的情况.

如果有编译器或场景(size_t)((char *)0) != 0,那是什么?

AnT*_*AnT 4

嗯,如您所知,给定类型的空指针的物理表示不一定是全零位模式。当您强制将指针(任何指针)值转换为整数类型时,结果是实现定义的,但通常(这就是意图)指针的数值(数字地址)如果可能的话保持不变。这意味着,如果在给定平台上,类型的空指针char *由模式表示0xBAADF00D(例如),则上述表达式的计算结果将为0xBAADF00D, 而不是零。当然,为此您需要一个具有非零空指针的平台。我个人从未使用过此类平台,尽管我听说过许多类似的真实平台(例如,在嵌入式平台领域,这并不罕见)。

此外,作为补充说明,不同类型的空指针值可以具有不同的物理表示,这意味着理论上您可以从(size_t) ((int *) 0)(size_t) ((char *) 0)和获得不同的值(size_t) ((double *) 0)。但这将是一种相当奇特的情况,尽管从抽象 C 语言的角度来看这是完全可能的。

PS 请阅读此处(C 常见问题解答),了解具有非零空指针的实际平台的一些示例。