【发布时间】:2011-11-18 18:38:22
【问题描述】:
在发布了我最有争议的答案之一here 之后,我敢于提出几个问题,最终填补了我的一些知识空白。
假设x 本身是一个指针和一个左值,而不仅仅是某个表达式,为什么((type_t *) x) 类型的表达式不被认为是一个有效的左值?
我知道很多人会说“标准不允许这样做”,但从逻辑的角度来看,这似乎是合理的。标准不允许的原因是什么?毕竟,任何两个指针的大小都是相同的,而指针类型只是一个编译时抽象,表示在进行指针运算时应该应用的适当偏移量。
【问题讨论】:
-
我认为,“任何两个指针的大小相同”已经是错误的。不确定,但我认为这实际上取决于架构。见stackoverflow.com/questions/1241205/…
-
标准 C 保证指向对象的指针大小相同,但允许指向函数的指针大小不同(彼此之间以及指向对象的指针)。 POSIX 要求指向对象的指针与指向函数的指针大小相同。
-
@Jonathan:在n1256.pdf 中阅读 6.2.5/27:“...指向其他类型的指针不需要具有相同的表示或对齐要求。”
-
我说错了。 ISO 9899:1999 §6.2.5¶26 说:指向 void 的指针应具有与指向字符类型的指针相同的表示和对齐要求。类似地,指向兼容类型的合格或不合格版本的指针应具有相同的表示和对齐要求。所有指向结构类型的指针都应具有彼此相同的表示和对齐要求。所有指向联合类型的指针都应具有彼此相同的表示和对齐要求。指向其他类型的指针不需要具有相同的表示或对齐要求。
-
FWIW,POSIX 2008 标准说(系统接口,§2.12.3 指针类型): 所有函数指针类型都应具有与指向 void 的类型指针相同的表示。将函数指针转换为
void *不应改变表示。通过这种转换产生的void *值可以使用显式转换转换回原始函数指针类型,而不会丢失信息。注意:ISO C 标准不要求这样做,但符合 POSIX 要求。