可能重复:
Are there are any platforms where pointers to different types have different sizes?
我已经在几个地方读过,不同类型的指针在符合标准的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的指针应具有与a相同的表示和对齐要求 指向字符类型的指针。同样,指向合格或非限定版本的指针 兼容类型应具有相同的表示和对齐要求。所有指向结构类型的指针都应具有相同的表示和对齐要求 彼此相同。所有指向联合类型的指针都应具有相同的表示形式 对齐要求彼此。 指向其他类型的指针不必相同 表示或对齐要求。
所以,它确实听起来像一个符合标准的C99实现可以对不同类型的指针使用不同的表示。
我的问题是:存在哪些C实现/体系结构实际上对不同类型的指针使用不同的表示形式?
答案 0 :(得分:4)
可能最着名的是实模式x86处理器,它可能有16位数据指针和32位函数指针,具体取决于您选择的内存模型(或者您可以使用16位数据指针)位函数指针,或者又一些不同的东西......)。
答案 1 :(得分:4)
Classic Cray(不知道他们的新产品)无法使用常规指针来处理字符,因此char*
因此void*
与本机矢量指针不同。
(参见下面的Keith的评论。可能有不同的ABI正在使用中,通过将低阶地址位旋转到高阶端,他们有时会做出“精细”和“粗略”的指针兼容程度。)