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

c-s*_*ger 46 c types pointers

char*,int*,long*甚至是long long*同样大小的(在给定的平台)?

Joh*_*ode 51

它们不能保证大小相同,尽管在我经验丰富的平台上通常都是这样.

C 2011 在线选秀:

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

  • +1用于引用标准,真正指出它并覆盖所有边缘情况. (12认同)

Meh*_*ari 18

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

  • 但是,请注意void*必须能够保存任何数据指针. (10认同)
  • `void*`不能直接解除引用 - 你必须将它强制转换回原始类型.据推测,即使指针的表示实际上在不同类型之间有所不同,原始表示也会在您回退时恢复. (9认同)
  • 查尔斯,你误解了所说的话.它与`int`和`double`的大小无关(它可以是任何其他两种类型).关键是_pointers_本身的大小可能不同. (5认同)
  • 哇塞!真的么?我没意识到。 (2认同)
  • @CharlesBretana,您仍然需要对其中一个执行“sizeof”,以便计算出在分配指针数组时要分配多少字节,因为“malloc”需要多个字节。 (2认同)
  • @CharlesBretana:一点也不傻。`sizeof`(可能除了应用于变长数组类型时)的开销完全为零;它解析为一个常数。`sizeof (some_type*)` 比 `8` 好,因为它更明确——*而且*这意味着代码可以移植到其他系统。 (2认同)

Ste*_*off 7

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

例如,在飞思卡尔的HCS12处理器上,它有闪存,数据指针都是16位.

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

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

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


Jon*_*ler 7

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

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

2.12.3指针类型

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

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


Pav*_*aev 5

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

需要注意的是不论这一点,reinterpret_cast“荷兰国际集团一个指向另一个会往往不是导致UB,除了少数例外(void*,并unsigned char*为荚)。任何工会技巧也是如此。所以显而易见的问题是:你为什么要关心?


Kar*_*and 5

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