sizeof计算结构体联合的长度

来源:百度知道 编辑:UC知道 时间:2024/05/10 05:15:59
typedef union {long i; int k[5]; char c;} DATE;
struct data { int cat; DATE cow; double dog;} too;
DATE max;

void main()
{
printf("%d\n",sizeof(struct data)+sizeof(max));
}为什么是52
如果默认以最大字节对齐sizeof(DATE)应该是3*20=60 sizeof(data)=20总共是80
按double 对齐,cat和k[0]可以放在一个double里面,
k[1]k[2]可以放在一个double里面,
k[3]k[4]可以放在一个double里面,
dog放在一个double里面,
所以一共4个double,也就是32……
所以,答案就是32+20=52……

这段不懂
为什么是“cat和k[0]可以放在一个double里面,
k[1]k[2]可以放在一个double里面,
k[3]k[4]可以放在一个double里面”???

关于union的大小, 当一个共用体被声明时, 编译程序自动地产生一个变量, 其长度为联合中最大的变量长度的整数倍。
举例如下:
下例表示声明一个共用体foo:
union foo{
int i; //4
char c;//1
double k;//8
};
以上例而言,最大长度是double数据类型,所以foo的内存空间就是double型的长度。
union foo
{
char s[10];
int i;
};
在这个union中,foo的内存空间的长度为12,是int型的3倍,而并不是数组的长度10。若把int改为double,则foo的内存空间为16,是double型的两倍。

是这样滴,

sizeof(max)=20没有意见

sizeof(struct data)为什么会是32呢?

你可以试一下
struct data1{int cat;double dog;}
sizeof按最大字节对齐,答案是16,很好。

struct data1{int cat;int pig;double dog;}
sizeof按最大字节对齐,答案也是16,WHY。

因为按8字节对齐,int cat和int pig可以放在一起,也就是一个8字节里面。

struct data1{int cat;double dog;int pig;}
sizeof按最大字节对齐,答案是24,WHY……

因为按8字节对齐,int cat和int pig不可以放在一起……内存里面是:cat 空4字节…dog…pig 空4字节

如此,可以再回来看sizeof(struct data)

实际上是求sizeof(int cat; int k[5]; double dog;}),对吧?

按double 对齐,cat和k[0]可以放在一个double里面,
k[1]k[2]可以放在一个