2 jwentao01 jwentao01 于 2015.08.30 17:05 提问

一道用 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("%d\n",sizeof(struct str_type));
}

10个回答

Evankaka
Evankaka   Ds   Rxr 2015.08.30 19:05
已采纳

首先union u_type这个占用了8个字节
然后struct str_type会按8字节对齐
union u_type u[2];
这个有两个,占了16个字节
char str[100];
100+16,不能被8整除,系统会自动填充4个字节到120.
这样就可以整除

airc_gql
airc_gql   2015.08.30 17:42

首先你的系统是64位的,计算结构体大小时按8字节对齐。char str[100]占100字节,100%8=4,所以还需要补齐4字节,就是104.然后计算union u_type u[2],这里有两个联合,每个联合所占大小为8字节,加起来就是16.最后所有的加起来就是120了

caozhy
caozhy   Ds   Rxr 2015.08.30 17:48

http://codepad.org/wtImL3XB
不同的编译器不同,用gcc在线编译,结果就是116

作为题目,根本这个题目就是错的。

u011356069
u011356069   2015.08.30 17:29

可能是因为你的操作系统是64位的吧。

a1193561652
a1193561652   Rxr 2015.08.30 17:37

显然u_type是8byte,char 是1byte,那加起来应该116btye,但是要字节对其,结构体的大小要是最大成员长度的整数倍,所以就120了。

91program
91program   Ds   Rxr 2015.08.30 18:43

个人推荐你看一篇文章:WinCE 下结构体占用空间的分析,其实不只是 WinCE,也包括 Windows 平台。
其中有一段注释:
// 结构体实际占用的空间大小与结构体中占用空间最大的成员有什么关系?

// 结论: 结构体的大小为结构体中占用字节最大的成员的倍数。

其中的示例你可以分析一下。

songdan0201
songdan0201   2015.08.30 19:13

sizeof计算的是字节数,前面的共同体只能同时存储其中的一种类型,应该是116

name_zc
name_zc   2015.10.08 18:54

联合体union u_type所占内存大小为成员变量中所占内存最大的,所以为8为字节;char数组占100字节,联合体数组占16字节;
因为结构体中最大的变量内存为联合体8个字节,所以结构体总体大小以8字节对齐,所以由原来的116变为120

u012814689
u012814689   2015.11.30 17:12

8*2+100补4字节=120

yang004
yang004   2016.06.17 13:03

union u_type
{
int i;
double x;
float f;
};
struct str_type
{
char str[100];
union u_type u[2];
}test;
printf("%p\n",test.str);
printf("%p\n",test.u);
printf("%d\n",sizeof(struct str_type));

输出结果:
0x7fffb0ea0340
0x7fffb0ea03a8
120

test.str和test.u中间差别104个字节,加上两个8字节,正好120

Csdn user default icon
上传中...
上传图片
插入图片