对于所有数据类型,所有数据指针在一个平台中的大小是否相同?

时间:2009-08-06 20:26:58

标签: c pointers types

相同尺寸的char*int*long*甚至long long*(在给定平台上)?

8 个答案:

答案 0 :(得分:49)

虽然在我们经常遇到的平台上,但它们不能保证大小相同。

C 2011 online draft

6.2.5类型
...
28指向 void 的指针应具有与a相同的表示和对齐要求 指向字符类型的指针。 48)同样,指向合格或非限定版本的指针 兼容类型应具有相同的表示和对齐要求。所有 指向结构类型的指针应具有相同的表示和对齐要求 彼此相同。所有指向联合类型的指针都应具有相同的表示形式 对齐要求彼此。指向其他类型的指针不必相同 表示或对齐要求。
48)相同的表示和对齐要求意味着可互换性 函数的参数,函数的返回值和联合的成员。

答案 1 :(得分:18)

不一定。该标准不保证sizeof(double*) == sizeof(int*)。例如,假设处理器具有两个具有不同宽度的地址总线(如在一些哈佛架构处理器上),它可以具有不同大小的指针。

答案 2 :(得分:7)

在具有存储(分页)RAM和/或闪存的16位嵌入式处理器上,使用页面可能会导致指针大小不同 - 尽管这与它们指向的数据大小无关。

例如,飞思卡尔的HCS12处理器已经存储了闪存,数据指针都是16位。

但是,函数指针对于近指针是16位(对于与调用函数相同的页面中的代码,或者在未存储的闪存中),或者对于远指针(对于不同页面中的代码)是24位,并且包含页码在地址。

如果你想在分页闪存中存储常量数据,事情会很复杂,因为数据指针大小的限制,使用数据的函数必须与被访问的数据位于同一页面。

可以想象,具有存储区RAM的16位处理器对于近端和远端数据指针同样具有不同的大小。

答案 3 :(得分:7)

请注意C标准所说的内容 - 正如John Bode所引用的那样。另请注意,C标准根本没有说明函数指针的大小。

POSIX标准规定了一些额外的要求:

  

2.12.3指针类型

     

所有函数指针类型应与void指向的类型指针具有相同的表示形式。将函数指针转换为void *不得改变表示。这种转换产生的void *值可以使用显式转换转换回原始函数指针类型,而不会丢失信息。

     

注意:ISO C标准不要求这样做,但它是POSIX一致性所必需的。

答案 4 :(得分:4)

在C或C ++ ISO标准中都没有这样的保证,但在实践中,我还没有看到一个不存在的平台。

请注意,无论如何,reinterpret_cast指向另一个的void*指针往往会导致U.B.,但有一些例外(POD)unsigned char*和{{1}}。任何工会技巧都会如此。所以显而易见的问题是:你为什么要关心?

答案 5 :(得分:4)

使用Watcom C编程x86实模式时,您可以使用16位近指针和32位远指针的混合内存模型。

答案 6 :(得分:2)

在DOS保护模式下,函数指针和数据指针的长度可能不同,因为数据可能位于不同的部分。

答案 7 :(得分:0)

通常是的,所有指向任何东西的指针,无论它们指向int还是long或字符串,还是字符串或函数数组,都指向单个内存地址,它在机器上的大小相同。这是因为机器上的Processer有一个地址寄存器,这些指针被加载到这个地址寄存器中,并且该地址寄存器的大小控制着指针的大小。

唯一的例外可能是旧的Intel 8088 16位机器,其中有两个步骤来确定内存地址,涉及16位段指针(在1MByte地址中识别出64K块内存)空间),然后是第二个16位存储器地址,以识别该段内的特定存储器地址。然后组合这两个16位地址以获得完整的20位存储器地址。在那种情况下,我想,有可能区分各个16位地址和组合的20位地址。