问题描述
- 一道用 sizeof 求结构体所占大小的笔试题?求教
-
下列程序,为什么输出的结果是 120?int main(int argc, char* argv[]) { union u_type { int i; double x; float f; }; struct str_type { char str[100]; union u_type u[2]; }; printf("%dn",sizeof(struct str_type)); }
解决方案
首先union u_type这个占用了8个字节
然后struct str_type会按8字节对齐
union u_type u[2];
这个有两个,占了16个字节
char str[100];
100+16,不能被8整除,系统会自动填充4个字节到120.
这样就可以整除
解决方案二:
首先你的系统是64位的,计算结构体大小时按8字节对齐。char str[100]占100字节,100%8=4,所以还需要补齐4字节,就是104.然后计算union u_type u[2],这里有两个联合,每个联合所占大小为8字节,加起来就是16.最后所有的加起来就是120了
解决方案三:
http://codepad.org/wtImL3XB
不同的编译器不同,用gcc在线编译,结果就是116
作为题目,根本这个题目就是错的。
解决方案四:
可能是因为你的操作系统是64位的吧。
解决方案五:
显然u_type是8byte,char 是1byte,那加起来应该116btye,但是要字节对其,结构体的大小要是最大成员长度的整数倍,所以就120了。
解决方案六:
个人推荐你看一篇文章:WinCE 下结构体占用空间的分析,其实不只是 WinCE,也包括 Windows 平台。
其中有一段注释:
// 结构体实际占用的空间大小与结构体中占用空间最大的成员有什么关系?
// 结论: 结构体的大小为结构体中占用字节最大的成员的倍数。
其中的示例你可以分析一下。
解决方案七:
sizeof计算的是字节数,前面的共同体只能同时存储其中的一种类型,应该是116
解决方案八:
联合体union u_type所占内存大小为成员变量中所占内存最大的,所以为8为字节;char数组占100字节,联合体数组占16字节;
因为结构体中最大的变量内存为联合体8个字节,所以结构体总体大小以8字节对齐,所以由原来的116变为120
解决方案九:
8*2+100补4字节=120