C标准允许指向不同类型的指针具有不同的大小,例如,允许使用sizeof(char*) != sizeof(int*).然而,它确实要求,如果指针被转换为void*,然后又被转换回其原始类型,那么它必须与其原始值进行比较.因此,从逻辑上讲,sizeof(void*) >= sizeof(T*)代表所有类型T,对吗?

在目前使用的大多数常见平台(x86、PPC、ARM和64位变体等)上,所有指针的大小都等于本机寄存器大小(4或8字节),而不管指向的类型是什么.是否有任何深奥或嵌入式平台,指向不同类型的指针可能有不同的大小?我特别询问了大约data个指针,不过我也很想知道是否有平台上function个指针的大小不寻常.

我肯定not%地询问C++的成员指针和成员指针函数,它们在公共平台上具有不寻常的大小,甚至在一个平台内可能会有所不同,这取决于指针类的属性(非多态、单继承、多重继承、虚拟继承或不完整类型).

推荐答案

Answer from the C FAQ:

Prime 50系列使用07777段,偏移量0作为空指针,至少在PL/I中是这样.后来的模型在C中使用0段,偏移量0作为空指针,这就需要新的指令,比如TCNP(Test C null pointer),显然是为了解决所有现存的写得不好、假设不正确的C代码.旧的、字寻址的素数机器也因需要比字指针(int*)更大的字节指针(char*)而臭名昭著.

Data General的Eclipse MV系列有三种体系 struct 支持的指针格式(字、字节和位指针),其中两种由C编译器使用:用于char*和void*的字节指针,以及用于其他所有内容的字指针.由于历史原因,在32位MV线路从16位Nova线路演变为32位MV线路的过程中,字指针和字节指针在字的不同位置具有偏移、间接和环形保护位.将不匹配的指针格式传递给函数会导致保护故障.最后,mvc编译器添加了许多兼容性选项,以try 处理指针类型不匹配错误的代码.

一些霍尼韦尔公牛大型机对(内部)空指针使用位模式06000.

CDC Cyber 180系列具有由环、段和偏移量组成的48位指针.大多数用户(在环11中)的空指针为0xB00000000000.在旧的CDC 1-补码机器上,使用全一位字作为所有类型数据(包括无效地址)的特殊标志是很常见的.

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

Symbolics Lisp机器是一种带标签的体系 struct ,它甚至没有传统的数字指针;它使用该对(基本上是一个不存在的句柄)作为C空指针.

根据使用的"内存型号",8086系列处理器(PC

一些64位Cray机器在一个数组的48位低位代表int*

其他链接:message from Chris Torek,提供更多详细信息 关于这些机器中的一些.

C++相关问答推荐

有关字符数组指针和次指针以及qsort函数中的cmp函数的问题

如何启用ss(另一个调查套接字的实用程序)来查看Linux主机上加入的多播组IP地址?

常数函数指针优化

字符数组,字符指针,在一种情况下工作,但在另一种情况下不工作?

C指针算法在函数参数中的应用

当打印字符串时,为什么在c中没有使用常量限定符时我会收到警告?

从组播组地址了解收到的数据包长度

LONG_DOUBLE_T是否存在(标准C:C23)

字符是否必须转换为无符号字符,然后才能与getc家族的返回值进行比较?

什么是.c.h文件?

为什么用非常数指针变量改变常量静态变量时会出现分段错误?

如何在GET_STRING输入后对少数几个特定字符串进行C判断?

递归打印二维数组(C编程)

将数字的每一位数平方,并使用C将它们连接为一个数字(程序不能正确处理0)

S,在 struct 中创建匿名静态缓冲区的最佳方式是什么?

某些EAX值的不同调用方的CPUID结果不一致

当我将偏移量更改为任何非零值时,C中的mmap共享内存出现无效参数错误

指向返回 struct 成员的指针,安全吗?

#define X Defined(Y) 是有效的 C/C++ 宏定义吗?

全局变量 y0 与 mathlib 冲突,无法编译最小的 C 代码