如果我打印FILE
或FILE
实例的大小,则结果为216字节
64位系统和32位系统中的148字节(操作系统:Ubuntu 16.04,编译:GCC)
printf("size : %zu",sizeof(FILE));
OR
FILE *fp;
printf("size : %zu",sizeof(*fp));
谁能解释为什么它显示这么大的大小,因为我检查了结构成员主要是指针。
答案 0 :(得分:4)
结果是在64位系统中为216字节,在32位系统中为148字节
谁能解释为什么它显示这么大的大小,因为我检查了结构成员主要是指针。
FILE
结构的内容是特定于实现的(这意味着它们在不同的平台中是不同的)。
在32位系统上,指针的大小通常为4个字节,而在64位系统上,指针的大小通常为8个字节。
因此您可以轻松解决所看到的大小差异(216-148 = 68)。 (据我记得,这种结构在Ubuntu GCC中大约有15个指针)。
除了指针之外,其他类型的大小,例如int
,long
(可以是FILE
结构的一部分)等也可以与32位和64位系统不同。
在下面包括@MatteoItalia评论:
尤其是,使用来自glibc的this definition(并且未定义_IO_USE_OLD_IO_FILE
),我确实获得了148个字节(带有4个字节的int,指针,size_t
和__off_t
)。
关于差异,有超过17个指针(加上填充!)可以解决差异,但是最后还有一些显式填充使计算复杂化(在64位上确实变小了,如{ {1}}在32位上为40,但在64位上为24)
答案 1 :(得分:0)
FILE
结构的内容和大小完全取决于实现。在64位模式下,它恰好是216个字节;在32位模式下,它恰好是148个字节。差异可能是由于此结构的某些成员在32位和64位模式之间大小不同:指针较大以及size_t
和文件位置,这实际上取决于C库的方式处理标准流。
请注意,一些额外的信息可能会存储在结构外部...在任何情况下,您都无法将FILE
保存到本地变量并安全地恢复它。
请注意,FILE
也可能是不完整的类型:typedef
用于指向没有定义的结构的指针,在这种情况下,sizeof(FILE)
会导致编译错误。将定义放在<stdio.h>
标头中的主要原因是允许宏直接访问成员。查看您的<stdio.h>
文件,并在开源中寻找其他实现,例如newlib或glibc。
此外,C标准并没有要求FILE
必须是结构的typedef
:它可能不是结构,可以定义为int
。