为了账号安全,请及时绑定邮箱和手机立即绑定

请问是否有指向不同类型的指针具有不同大小的平台?

请问是否有指向不同类型的指针具有不同大小的平台?

C
守着一只汪 2019-11-05 09:04:22
是否有指向不同类型的指针具有不同大小的平台?C标准允许指向不同类型的指针具有不同的大小。sizeof(char*) != sizeof(int*)是允许的。但是,如果指针被转换为void*然后将其转换回其原始类型,则必须将其与其原始值进行比较。因此,从逻辑上讲,sizeof(void*) >= sizeof(T*)适用于所有类型T对不对?在目前使用的大多数常用平台(x86、ppc、ARM和64位变体等)上,所有指针的大小都等于本机寄存器大小(4或8个字节),而不考虑指向类型。是否存在指向不同类型的指针可能具有不同大小的深奥或嵌入式平台?我特别想问的是数据指针,虽然我也想知道是否有平台功能指针的尺寸不寻常。我绝对是不询问C+的指针到成员函数和指针到成员函数。这些函数在公共平台上具有不寻常的大小,甚至可以根据指针到类的属性(非多态、单继承、多重继承、虚拟继承或不完全类型)在一个平台内变化。
查看完整描述

3 回答

?
梦里花落0921

TA贡献1772条经验 获得超6个赞

C常见问题解答:

素50系列使用了段07777,偏移量0用于空指针,至少对于PL/I,后来的模型使用段0,偏移量0用于C中的空指针,这就需要新的指令,如tcnp(测试C空指针),显然是对所有现存的错误C代码的一种sop,这些代码做了错误的假设。较旧的、以字为地址的Prime机器也因需要更大的字节指针(char*s)而闻名于Word指针(int*s)。

DataGeneral中的EclipseMV系列有三种体系结构支持的指针格式(Word、字节和位指针),其中两种由C编译器使用:char*和void*的字节指针和用于其他所有内容的Word指针。由于历史原因,从16位Nova行到32位MV线的演变过程中,字指针和字节指针在单词中的不同位置具有偏移、间接和环保护位。将不匹配的指针格式传递给函数会导致保护错误。最后,MVC编译器添加了许多兼容性选项,以尝试处理具有指针类型不匹配错误的代码。

一些Honeywell-Bull大型机使用位模式06000作为(内部)空指针.

CDC Cyber 180系列有48位指针,由环、段和偏移组成.大多数用户(在第11圈中)都有0xB00000000000的空指针。在旧的cdc ONE补码机上,使用全位字作为各种数据的特殊标志是很常见的,包括无效的地址。

旧的HP 3000系列使用了与字地址不同的字节地址寻址方案;因此,与上面的几台机器一样,它对char*和void*指针使用了与其他指针不同的表示形式。

SymbolicsLispMachine是一种带标记的体系结构,它甚至没有传统的数字指针;它使用这对(基本上是一个不存在的句柄)作为C空指针。

根据正在使用的“内存模型”,8086系列处理器(PC兼容)可以使用16位数据指针和32位函数指针,反之亦然。

一些64位Cray机器在单词的下48位中表示int*;char*另外使用上16位中的一些来表示一个字内的字节地址。



查看完整回答
反对 回复 2019-11-06
?
慕莱坞森

TA贡献1810条经验 获得超4个赞

不完全是你想要的,但在16位DOS/Windows时代,你确实有指针和远指针的区别,后者是32位。

我可能有语法错误.。

int *pInt = malloc(sizeof(int));int far *fpInt = _fmalloc(sizeof(int));printf("pInt: %d, fpInt: %d\n", sizeof(pInt), sizeof(fpInt));

产出:

品脱:2,fpInt 4



查看完整回答
反对 回复 2019-11-06
?
一只甜甜圈

TA贡献1836条经验 获得超5个赞

因此,从逻辑上讲,sizeof(void*) >= sizeof(T*)对于所有类型的T,对吗?

这并不一定是必然的,因为size of是关于存储表示的,并不是所有的位模式都必须是有效值。我认为您可以编写一个一致的实现sizeof(int*) == 8sizeof(void*) == 4,但int*的可能值不超过2^32。不知道你为什么想这么做。


查看完整回答
反对 回复 2019-11-06
  • 3 回答
  • 0 关注
  • 520 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信