C sizeof(int)是否保证等于sizeof(void*)

C sizeof(int)是否保证等于sizeof(void*),c,sizeof,C,Sizeof,在c语言中,数据类型“int”的大小是否总是等于指针的大小 我只是好奇。一点也不,不能保证sizeof(int)==sizeof(void*)。在Linux/AMD64上,sizeof(int)是4个字节,sizeof(void*)是8个字节(与该平台上的sizeof(long)相同) 最近的C标准(例如C99)定义了一个标准头,该头应定义一个整型intptr\u t,该整型保证具有指针的大小(甚至可能是指针的可逆浇铸) 我认为该标准并不能保证所有指针都具有相同的大小,特别是指向函数的指针可以比

在c语言中,数据类型“int”的大小是否总是等于指针的大小


我只是好奇。

一点也不,不能保证
sizeof(int)==sizeof(void*)
。在Linux/AMD64上,
sizeof(int)
是4个字节,
sizeof(void*)
是8个字节(与该平台上的
sizeof(long)
相同)

最近的C标准(例如C99)定义了一个标准头
,该头应定义一个整型
intptr\u t
,该整型保证具有指针的大小(甚至可能是指针的可逆浇铸)

我认为该标准并不能保证所有指针都具有相同的大小,特别是指向函数的指针可以比数据指针“更大”(我无法说出一个平台的名称)。我相信最新的Posix标准要求这样做(例如for)

另见和C11标准草案(或更好)


注:在2021年,我无法用
sizeof(long)!=sizeof(void*)
。但是在上个世纪,old可能就是这样一个平台。

不。一些(大部分是旧的,VAX时代)代码假设这一点,但它肯定不是必需的,并且假设它不可移植。有两种不同的实际实现(例如,当前的一些64位环境使用64位指针和32位int)。

否。例如,在大多数64位系统中,int为4字节,void*为8。

不保证

例如,在大多数64位系统中,两种大小通常是不同的

即使
sizeof(int*)
也不能保证等于
sizeof(void*)

void*
大小的唯一保证是

sizeof (void *) == sizeof (char *)
   == sizeof (signed char *) == sizeof (unsigned char *)

当涉及整数或指针大小时,C语言不提供任何保证

int
的大小通常与数据总线宽度相同,但不一定相同。指针的大小通常与地址总线宽度相同,但不一定相同

许多编译器使用非标准扩展(如
far
关键字)来访问超出默认指针类型宽度的数据


除了64位系统外,还有许多微控制器/微处理器体系结构,其中int的大小和指针的大小不同。Windows 3.1和DOS是其他示例。

不能保证这两种类型的大小之间存在任何关系,也不能保证通过双向转换在另一种类型中忠实地表示这两种类型。这都是实现定义的

话虽如此,在现实世界中,除非您处理的是真正晦涩难懂的传统16位系统或奇数DSP之类,
sizeof(int)
将小于或等于
sizeof(void*)
,您可以忠实地将
int
值转换为
void*
以将它们传递给接口(如
pthread\u create
)使用一个通用的
void*
参数,以避免浪费分配和释放内存来存储单个
int
。特别是,如果您已经在使用POSIX或Windows界面,这绝对是一个安全的现实假设


您应该永远不要假设
void*
可以在
int
中忠实地表示(即,将指针投射到
int
并返回)。这在任何流行的现实世界64位系统上都不起作用,在不久的将来,它所使用的系统的百分比肯定会大幅下降。

否。指针类型不必与整数类型具有相同的大小或表示形式。以下是C语言标准中的一些相关部分(在线草稿可用):

6.2.5类型

27无效指针的表示和对齐要求应与 指向字符类型的指针。39)类似地,指向兼容类型的合格或不合格版本的指针应具有相同的表示和对齐要求。指向结构类型的所有指针应具有相同的表示和对齐要求 就像我们彼此一样。所有指向联合类型的指针应具有相同的表示形式和 校准要求彼此一致。指向其他类型的指针不必具有相同的属性 表示或对齐要求。

39)相同的表示和对齐要求意味着互换性 函数参数、函数返回值和联合成员。

6.3.2.3指针

5整数可以转换为任何指针类型。除非之前另有规定,否则 结果是定义了实现,可能未正确对齐,可能未指向 引用类型的实体,可能是陷阱表示。56)

6任何指针类型都可以转换为整数类型。除非之前另有规定,否则 结果是定义了实现。如果结果不能用整数类型表示, 该行为未定义。结果不必在任何整数的值范围内 类型。

56)用于将指针转换为整数或将整数转换为指针的映射函数旨在 与执行环境的寻址结构保持一致。
不,不必如此,但通常情况下,
sizeof(long)==sizeof(void*)

您知道今天有哪个平台
sizeof(int*)
!=<代码>大小(无效*)??25年前,这在克雷YMP超级计算机上是真的。我不知道当前的平台在哪里是正确的(或者可能是一些DSP?。@BasileStarynkevitch For Cray/Unics我知道一些平台对
void*
(64位)和
int*
(32位)有不同的内存表示,但我知道的那些平台对这些指针仍然有相同的内存大小(都是64位)。我所知道的唯一其他信息是这个c-faq链接,它列出了一些机器
c语言不保证任何安全性