关于面试题中 struct 内存长度感想

最近面试中遇到了  求struct结构内存长度问题,当时没回答上来,后来通过网上收集资料和调试程序,总结了这类问题的答案。


首先要了解#pragma pack(k)宏(其中,k为2的n次方), 这决定了调试结果,我们把一个结构所占内存看成大盒子,那么结构中包含的数据必须以一定的规则存放在大盒子里,如何存放呢?步骤如下

第一步:系统提供体积为K值的小盒子,我们先要把数据存放在这些小盒子里,存放的规则是:小盒子是存放的最小单位!    举个例子,K=4时,那么存入char i0,i0就占一个单位,即4b, char i1[5],那么i1就占2个单位,即8b。 另外,当struct中存放本身的对象,那么,就隔一个空盒子在存本身的对象。


第二步:若不显式调用此宏,则linux下,K默认为4, windows下,K默认为8。这里有一个优先度:结构中,如果最大的数据类型大于或者等于K,则此宏会被正常调用,否则K值会被强制改成最大的数据类型长度,即当 #pragma pack(8)时,若struct中最大只有int 类型时,K会被强制变成4,即#pragma pack(4)。


另外我调试时犯过一个常识性错误,把 char a[5]当成长5b的类型,其实不然,这只是5个1b的合并,若K=4时在为a分内存的时候,占8b,而不是4*5b。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值