sizeof(int)保证等于sizeof(void *)

时间:2012-01-18 19:13:46

标签: c sizeof

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

我只是好奇。

8 个答案:

答案 0 :(得分:8)

完全没有,我无法保证sizeof(int) == sizeof(void*)。在Linux / AMD64 sizeof(int)上是4个字节,sizeof(void*)是8个字节(与该平台上的sizeof(long)相同)。

最近的C标准(例如C99)定义了一个标准头<stdint.h>,它应该定义一个整数类型intptr_t,它保证具有指针的大小(甚至可能是可逆的)可以转换为指针)。

我认为标准并不能保证所有指针都具有相同的大小,特别是指向函数的指针可能比数据指针“更大”(我不能将它命名为平台,它是真的)。我认为最近的Posix标准要求(例如dlsym)。

答案 1 :(得分:2)

没有。例如,在大多数64位系统中,int是4个字节,void *是8。

答案 2 :(得分:2)

无法保证。

例如,在大多数64位系统中,两种尺寸通常都不同。

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

void *尺寸的唯一保证是

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

答案 3 :(得分:1)

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

答案 4 :(得分:1)

当涉及整数或指针大小时,C语言不能保证任何东西。

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

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

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

答案 5 :(得分:1)

不保证这两种类型的大小之间有任何关系,也不能通过往返演员在另一种中忠实地表现出来。这都是实现定义的。

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

你应该从不假设void *可以在int中忠实地表示(即投射指向int并返回)。这在任何流行的真实64位系统上都不起作用,并且它所使用的系统的百分比肯定会在不久的将来直线下降。

答案 6 :(得分:1)

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

6.2.5类型
...
27指向void的指针应具有与a相同的表示和对齐要求 指向字符类型的指针。 39)类似地,指向兼容类型的限定或非限定版本的指针应具有相同的表示和对齐要求。所有指向结构类型的指针都应具有相同的表示和对齐要求 彼此相同。所有指向联合类型的指针都应具有相同的表示形式 对齐要求彼此。指向其他类型的指针不必相同 表示或对齐要求。
...
39)相同的表示和对齐要求意味着可互换性 函数的参数,函数的返回值和工会的成员 ...
6.3.2.3指针
...
5整数可以转换为任何指针类型。除非事先指明,否则 结果是实现定义的,可能没有正确对齐,可能不指向 引用类型的实体,可能是陷阱表示。 56)

6任何指针类型都可以转换为整数类型。除非事先指明,否则 结果是实现定义的。如果结果无法以整数类型表示, 行为未定义。结果不必在任何整数的值范围内 类型。
...
56)用于将指向整数或整数的指针转换为指针的映射函数 与执行环境的寻址结构一致。

答案 7 :(得分:-1)

不是,不是必须的,但是sizeof(long) == sizeof(void*)通常就是这种情况。