首页 > 编程知识 正文

struct在c语言中的字节数,struct长度计算

时间:2023-05-06 05:44:00 阅读:241560 作者:1041

若结构体为空,其大小为1;
若不为空,结构体的存储比较复杂,并不是简单的字节相加,比如:

struct student { char name; int id; double score; };

按照我们一般的想法结构体的字节数sizeof(student)=1+4+8=13,然而我们在代码中验证后就会发现sizeof(student)=16;这是为什么呢?:原来是因为内存存储的字节对齐 造成的。所谓的字节对齐是为了加快计算机的处理速度,我们一般把数据类型都放在能够被其字节大小整除的地址上。比如对于结构体student,假设此结构体的存储首地址pt能够被1和4,8整除(char ,int和double 的存储字节数),其实事实上计算机也是这样安排的,存储过程如下:
name占一个字节,直接存储
id如果直接存储,则id的存储地址(pt+1)不会被4整除,因此我们为了使字节对齐,就会在name后面填充3个字节然后存储id
score直接存储的地址可以被8整除,所以我们不用填充字节
总的字节数sizeof(student)=4+4+8=16;
为了总结出一般的规律,我们使用偏移量这个概念:结构体成员存储地址与结构体首地址的偏移字节数。计算结构体大小时,请按照以下准则:
1.各成员变量的偏移量必须为该成员大小的整数倍,如不够则在上一个变量后填充字节数
2.在所有成员计算以后,结构体的总大小—必须为成员变量中最宽类型的整数倍,如不够则在最后的变量后填充字节数
例:

struct teacher { char name; short age; double salary; int id; };

name 偏移量为0,直接存储1个字节(已占用1个字节)
age 若直接存储偏移量为1,不是2的倍数,所以在name后面填充1个字节然后存储(已占用4个字节)
salary 若直接存储偏移量为4,不是8的倍数,所以age后面填充4个字节(已占用16个字节)
id 若直接存储偏移量为16,是4的倍数,所以直接存储(已占用20个字节)
20不是double(teacher结构体中最宽类型)字节的整数倍,所以填充4个字节使其成为整数倍。最后得出结构体的大小为24个字节。

结构体中包含复合类型

struct A { char v1; double v2; }; struct B { int v1; A v2; char v3; };

1.复合型变量的偏移量必须为 该变量中最宽数据类型大小 的整数倍;
2.先将复合型变量解散为基本变量,再寻找结构体中最宽的数据类型
3.复合类型中,结构体里面复杂类型字节按整体存储字节计算,但最宽数据类型是在解散为基本变量的情况下去找。
上述例子中srtuct B:
v1偏移量为0,是4的整数倍,直接存储(已占用4个字节)
v2 若直接存储偏移量为4,不是8(v2中最宽数据类型double字节数)的整数倍,所以在v1后填充4个字节数然后存储(已占用24个字节)
v3 若直接存储偏移量为24,是1的整数倍,直接存储(已占用25个字节)
25不是double(B中最宽类型)字节的整数倍,所以填充7个字节使其成为整数倍。最后得出结构体的大小为32个字节

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。