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

我在几个地方读到,不同类型的指针在符合标准的 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 内容如下:

指向空隙的指针应具有与角色类型的指针相同的表示和对齐要求。同样,兼容类型的合格版本或不合格版本的指针应具有相同的表示和对齐要求。所有指向结构类型的指针均应具有与彼此相同的表示和对齐要求。所有指向工会类型的指示应具有与彼此相同的表示和一致要求。 其他类型的指针不需要具有相同的表示或对齐要求。

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

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

有帮助吗?

解决方案

Classic Cray(不知道他们的新产品)无法使用常规指针来寻址字符,所以 char* 因此 void* 与本机向量指针不同。

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

其他提示

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top