学习C语言结构体内存对齐

struct Score{
    float language;//语文
    float english;//英语
    float math;//数学
};
struct Student{
    int SID;//学号
    char name[20];//姓名
    char sex;//性别
    int age;//年龄
    char address[40];//地址
    int height;//身高
    struct Score subject;//主科目成绩
};
Struct Student stu;

注意:本文针对4字节对齐系统叙述

单独对结构体成员变量进行size计算:

Score成员均为float类型,大小为4个字节即一个字(在许多计算机系统中以4个字节为一个字),因此Score的长度为4*3=12;

Student成员int 占4个字节、char占1个字节、结构体占12个字节,那么它的总长度应该是:4+1*20+1+4+1*40+4+12=85,但我们使用sizeof(stu)发现计算出的值为88而非85,这是什么原因导致的呢?这里出现差异的关键点就是计算机内存对齐原理。在计算机对内存的管理是以字为单位的,如果再一个字中只存放一个字符的长度,虽然只占了一个字节,但该字中的其它三个字节需根据下一个成员类型决定,若超出字节,则会在下一个字开始存放。因此长度计算为88=4+1*20+4+4+1*40+4+12。

将结构体Student中成员sex数据类型改为int型:

struct Score{
    float language;//语文
    float english;//英语
    float math;//数学
};
struct Student{
    int SID;//学号
    char name[20];//姓名
    int sex;//性别
    int age;//年龄
    char address[40];//地址
    int height;//身高
    struct Score subject;//主科目成绩
};
Struct Student stu;

此时该结构体长度为:88=4+1*20+4+4+1*40+4+12。

不妨再将Score结构体成员language和english数据类型更改为char型:

struct Score{
    char language;//语文
    char english;//英语
    float math;//数学
};
struct Student{
    int SID;//学号
    char name[20];//姓名
    int sex;//性别
    int age;//年龄
    char address[40];//地址
    int height;//身高
    struct Score subject;//主科目成绩
};
Struct Student stu;

则该结构体长度为:1+1+4=8,这是因为前两成员为均只占1个字节,两成员共占2个字节,剩下两字节无法存float类型,因此下一成员会从下一个字存放,因此该结构体总共占用两个字存储空间,因此结构体长度为8=4+4;

                 float

 

 

char

char

不妨继续调整结构Score顺序:

struct Score{
    char language;//语文
    float math;//数学
    char english;//英语
};
struct Student{
    int SID;//学号
    char name[20];//姓名
    char sex;//性别
    int age;//年龄
    char address[40];//地址
    int height;//身高
    struct Score subject;//主科目成绩
};
Struct Student stu;

则现在该结构体的长度却不在是8,这是因为第一个成员占用1个字节,该字剩余3字节无法存储下一成员,因此会从下一个字存储,这个字存储满四个字节,下一成员在从下一个字进行存储,因此现在这个结构体Score占据3个字存储空间,长度为12=4+4+4。

 

 

 

char

                 float

 

 

 

char

因此我们在进行结构体成员声明时需要注意到内存对齐的问题,声明时尽量将相同类型的变量放在一起

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值