c-在一个平台上,所有数据类型的所有数据指针大小都相同吗?

(在给定平台上)char*int*long*甚至是long long*是否具有相同大小?

c-stranger asked 2020-06-27T20:08:36Z
8个解决方案
50 votes

尽管我通常在平台上有经验,但不能保证它们的大小相同。

C 2011在线草案:

6.2.5类型
...
28指向void的指针应具有与指向字符类型的指针。48)同样,指向合格或不合格版本的字符的指针。兼容类型应具有相同的表示和对齐要求。 所有结构类型的指针应具有相同的表示和对齐要求彼此。 所有指向联合类型的指针应具有相同的表示形式,并且相互之间的对齐要求。 指向其他类型的指针不必相同表示或对齐要求。
48)相同的表示和对齐要求意在暗示与函数的参数,函数的返回值以及并集的成员。
John Bode answered 2020-06-27T20:09:13Z
18 votes

不必要。 该标准不能保证sizeof(double*) == sizeof(int*)。例如,假定具有两个宽度不同的地址总线的处理器(例如在某些哈佛体系结构处理器上),则其指针大小可能不同。

Mehrdad Afshari answered 2020-06-27T20:09:33Z
7 votes

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

例如,在具有存储闪存的飞思卡尔HCS12处理器上,数据指针均为16位。

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

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

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

Steve Melnikoff answered 2020-06-27T20:10:11Z
7 votes

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

POSIX标准提出了一些额外的要求:

2.12.3指针类型

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

注意:ISO C标准不需要这样做,但是为了符合POSIX要求,它是必需的。

Jonathan Leffler answered 2020-06-27T20:10:50Z
4 votes

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

请注意,无论如何,除少数例外(void*unsigned char*和POD的例外)外,reinterpret_cast将一个指针指向另一个指针通常会导致访问U.B .. 任何工会技巧也将如此。 所以显而易见的问题是:你为什么要关心?

Pavel Minaev answered 2020-06-27T20:11:14Z
4 votes

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

Karl Voigtland answered 2020-06-27T20:11:34Z
2 votes

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

Blindy answered 2020-06-27T20:11:54Z
1 votes

通常,是的,所有指向任何内容的指针,无论它们指向的是int还是long,字符串,字符串数组或函数,都指向单个内存地址,该地址与计算机上的大小相同。 这是因为机器上的处理器具有将这些指针加载到的地址寄存器,并且该地址寄存器的大小控制着指针的大小。

唯一的例外可能是在诸如旧式Intel 8088 16位计算机之类的情况下,该过程有两个步骤来确定内存地址,其中包括一个16位段指针(在1MByte地址空间内标识了64K内存块), 然后是第二个16位内存地址,以标识该段内的特定内存地址。 然后将这两个16位地址组合在一起,以获得完整的20位存储器地址。 那么,在那种情况下,我想可能可以区分单个的16位地址和组合的20位地址。

Charles Bretana answered 2020-06-27T20:12:20Z
translate from https://stackoverflow.com:/questions/1241205/are-all-data-pointers-the-same-size-in-one-platform-for-all-data-types