所有数据types的所有数据指针在一个平台上的大小是否相同?
是char*
, int*
, long*
还是long long*
(相同大小)?
他们不能保证是相同的大小,虽然在我有他们平时经验的平台上。
C 2011 在线草案 :
6.2.5types
…
28指向void
的指针与指向字符types的指针具有相同的表示和alignment要求。 类似地,指向兼容types的合格或不合格版本的指针应具有相同的表示和alignment要求。 所有指向结构types的指针应该具有相同的表示和alignment要求。 所有指向联合types的指针应具有相同的表示和alignment要求。 指向其他types的指针不需要具有相同的表示或alignment要求。
48)相同的表示和alignment要求旨在将可互换性作为参数,从函数返回值以及联合成员。
不必要。 该标准不保证sizeof(double*) == sizeof(int*)
。 例如,假设一个处理器具有两个不同宽度的地址总线(就像在一些哈佛架构处理器上一样),它可以有不同大小的指针。
在具有分页(RAM)和/或闪存的16位embedded式处理器中,页面的使用可能会导致指针的大小不同,尽pipe这与指向的数据大小无关。
例如,在飞思卡尔拥有闪存的HCS12处理器上,数据指针都是16位。
然而,对于近指针(对于与调用函数相同的页面中的代码,或者在未分区的闪存中)或者对于远指针(对于不同页面中的代码),函数指针是16位,将页码合并到地址中。
如果你想在分页的闪存中存储常量数据,事情就很复杂,由于数据指针大小的限制,使用数据的函数必须和被访问的数据在同一页面。
可以想象,具有存储RAM的16位处理器对于近和远数据指针也将具有不同的大小。
注意C标准所说的 – 正如John Bode所引用的那样。 注意,C标准也没有提到函数指针的大小。
POSIX标准规定了一些额外的要求:
2.12.3指针types
所有的函数指针types都应该和指向void的types指针具有相同的表示forms。 将函数指针转换为void *不应改变表示forms。 由这种转换产生的void *值可以使用明确的转换转换回原始函数指针types,而不会丢失信息。
注:ISO C标准不要求这样做,但它是POSIX一致性所必需的。
在C或C ++ ISO标准中没有这样的保证,但在实践中,我还没有看到一个不适用的平台。
请注意,无论如何, reinterpret_cast
将一个指针指向另一个指针通常会导致UB,除了一些例外( void*
和unsigned char*
for POD)。 那么,任何联盟的伎俩。 所以显而易见的问题是:你为什么要关心?
当使用Watcom C编程x86实模式时,您可以使用16位近指针和32位远指针的混合内存模型。
在DOS保护模式下,函数指针和数据指针的长度可能不同,因为数据可能在不同的部分。
一般来说,所有指向任何东西的指针,无论它们是指向一个int还是一个long或一个string,或一个string或一个函数的数组,都指向一个单一的内存地址,这个内存地址在机器上是相同的。 这是因为机器上的Processer有一个地址寄存器,这些指针被加载进来,而地址寄存器的大小控制着指针的大小。
唯一的例外情况可能是像旧的Intel 8088 16位机器,其中有两个步骤来确定内存地址,包括一个16位段指针(在1MByte地址空间内标识了一个64K的内存块),然后用第二个16位存储器地址来标识该段内的特定存储器地址。 这两个16位地址然后被组合起来以获得完整的20位存储器地址。 那么在这种情况下,我想可能有可能区分单独的16位地址和组合的20位地址。