那里有哪些系统使用非均匀指针表示?

时间:2010-10-05 03:07:50

标签: c pointers system language-implementation

  

可能重复:
  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实现/体系结构实际上对不同类型的指针使用不同的表示形式?

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:4)

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

(参见下面的Keith的评论。可能有不同的ABI正在使用中,通过将低阶地址位旋转到高阶端,他们有时会做出“精细”和“粗略”的指针兼容程度。)