结构体的存储方式及其大小计算

关于结构体,在计算时候首先想到的就是对其,但是怎样去对其一直是比较头疼的事情,下面将个人理解分享一下:

计算结构体的大小时候,首先要把握的就是第一个数据成员一定是从偏移为0的位置开始存储,其他的数据成员要从自己大小的整数倍开始存储;其次就是补齐工作,结构体的总大小一定是内部数据成员的整数倍,不足的地方就需要补齐。如果结构体中成员变量有其他结构体类型,则该结构体数据成员中所有成员变量的大小都按其中最大的来计算。下面将举例详细介绍这些规则。

例如计算 struct A{

int a;

char b;

double c;

};

第一个数据成员为a,大小为4,存储位置从0~3;第二b大小为1,其整数倍可以是任何数,所以可以从4开始,存储位置为4;第三个c大小为8,存储位置必须从8开始在,则存储位置为8~15;最后一步是补齐工作,整个结构体大小必须是8的整数倍,故最后大小为4+4+8=16;

                   

a

a

a

a

b

0

0

0

c

c

c

c

c

c

c

c


struct B{

int a;

char b[2];

short c;

};

第一个数据成员为a,大小为4,存储位置为0~3,;第二个为b,大小为1*2,存储的起始位置为1的整数倍4~5;第三个为short,大小为2,存储位置为6~7;故整个结构体大小为8。

struct c{

int a;

char b[2];

short c;

struct A d;

};

第一个数据成员为a,大小为4,存储位置为0~3,;第二个为b,大小为1*2,存储的起始位置为1的整数倍4~5;第三个为short,大小为2,存储位置为6~7;结构体A的变量中包含一个int(4)、一个char(1)、一个double(8),其中最大的为double(8),因此d的大小为3*8=24,故整个结构体大小为8+24=32。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值