4

可能重复:
是否有任何平台指向不同类型的指针具有不同的大小?

我在几个地方读到不同类型的指针在符合标准的 C 实现中可能有不同的表示。这是需要将指针参数强制转换为 printf 的一件事,例如

int foo;
printf("address is %p\n", (void *) &foo);

我对此持怀疑态度,并浏览了 C99 标准(文档 WG14 N1256,可在http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf获得)。在 6.2.5.27 中写道:

指向 void 的指针应具有与指向字符类型的指针相同的表示和对齐要求。类似地,指向兼容类型的合格或不合格版本的指针应具有相同的表示和对齐要求。所有指向结构类型的指针都应具有彼此相同的表示和对齐要求。所有指向联合类型的指针都应具有彼此相同的表示和对齐要求。 指向其他类型的指针不需要具有相同的表示或对齐要求。

因此,听起来确实像符合 C99 的实现可以对不同类型的指针使用不同的表示。

我的问题是:存在哪些 C 实现/架构实际上对不同类型的指针使用不同的表示?

4

2 回答 2

4

最知名的可能是实模式 x86 处理器,它可以有 16 位数据指针和 32 位函数指针,具体取决于您选择的内存模型(或者您可以有 32 位数据指针和 16 位函数指针) ,或再次不同的东西......)。

于 2010-10-05T03:16:19.657 回答
4

Classic Cray(不知道他们的新产品)不能用常规指针寻址字符,因此char*void*原生向量指针不同。

(不过,请参阅下面基思的评论。可能使用了不同的 ABI,并且通过将低位地址位旋转到高位端,它们有时确实使“精细”和“粗略”指针与程度。)

于 2010-10-05T03:27:50.453 回答