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