所有指针的长度是否相同?

时间:2011-04-14 09:41:48

标签: c pointers

  

可能重复:
  Are there are any platforms where pointers to different types have different sizes?
  Can the Size of Pointers Vary Depending on what's Pointed To?

以32位机器为例。它几乎是32位长,无论什么类型,包括原始类型或聚合类型。我认为原因是指针实际上是虚拟地址空间中的索引,因此它与机器具有相同的长度。

Howerver,标准不需要这个:

  

6.2.5.27:

     

指向void的指针应具有与指向字符类型的指针相同的表示和对齐要求.39)同样,指向兼容类型的限定或非限定版本的指针应具有相同的表示和对齐要求。所有指向结构类型的指针都应具有相同的表示和对齐要求。所有指向union类型的指针都应具有相同的表示和对齐要求。指向其他类型的指针不需要具有相同的表示或对齐要求。

更有趣的是它没有提到函数指针。

所以我想知道为什么? 除了在早期的MS C中,由于早期Intel CPU中奇怪的段设计,所以有所谓的远指针和近指针。但是现在,这是不同的,分页和虚拟记忆将避免这样的事情。

另一个问题:

void *应该投放到任何类型。所以如果有不同的指针长度。例如,int * 4字节长,函数指针长8字节(仅举例)。那么演员如何实施? void *有一个固定的位模式,它会扩展为4字节int*和8字节函数指针吗?

4 个答案:

答案 0 :(得分:3)

更重要的问题是“对齐要求”。 char *可以指向任何字节,而int *可能只需要指向4的倍数的地址(如果int是32位)。

答案 1 :(得分:2)

结构和联合的指针都被限制为具有与C规则的附加结果相同的大小。我认为指向枚举的情况也是如此。

指向基本类型的指针可能大小不同。

这源于单词贴身机器。大多数指针只是单词的地址,但是char指针需要指示单词中的哪个char指向。 (在更现代的单词处理架构上,例如某些DSP,只需将单词用作char,但在过去,它将被视为浪费,并且不能与这些机器上的常规约定互操作。)

显然,void *必须与char *具有相同的结构。将void *分配给较小的指针只会丢弃“char in word”指示。为void *指定一个较小的指针只会使用“单词的第一个字符”。

另请参阅:Are there any platforms where pointers to different types have different sizes?

答案 2 :(得分:2)

您无法在函数指针和void*指针之间进行移植,因此您的部分问题基于错误的假设。

有关详细信息,请参阅this FAQ entry

我也反对“现在”的问题推理;改变C使其假定所有机器都像当前的主流硬件一样,并不是发展语言的正确方法。对指针类型和指针转换的限制的存在是为了捕获已经存在,可能是,并且很可能再次是实际的机器,这些限制使得(太)难以实现该语言。

答案 3 :(得分:-1)

指向基本类型的指针大小不同,但指向结构的指针大小相同。