sizeof计算结构体联合的长度

本文探讨了C语言中结构体内存对齐的问题,通过具体示例解释了如何计算结构体的大小,并讨论了不同元素排列方式对内存对齐的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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里面”???

--------------------------------------------------------------------
是这样滴, 

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]可以放在一个double里面, 
k[3]k[4]可以放在一个double里面, 
dog放在一个double里面, 
所以一共4个double,也就是32…… 

所以,答案就是32+20=52……
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值