结构体是用户建立由不同类型数据组成的组合型数据结构。
结构体的大小不是简单地数据类型的相加,而是需要考虑到系统在存储结构体变量时的地址对齐问题。
(1)结构体成员或者加上偏移量必须是下一个成员大小的整数倍
(2)结构体大小必须是最大成员大小的整数倍
struct A
{
int a; //4
float b;//4
};//8
int类型占4个字节,刚好是float类型的整数倍,这个结构体就直接相加就可以了。
struct B
{
char a;//1+3
int b;//4
};//8
因为char类型只占一个字节,int类型占4个字节,所以要偏移3个字节才是int的倍数,所以总共是8个字节
struct C
{
char a;//1+1
short b;//2
int c;//4
};//8
char类型占一个字节,short占两个字节,偏移量为1,相加为4,int类型占4个字节,4刚好是4的倍数,所以总共是8个字节
struct D
{
char a;//1+3
int b;//4
short c;//2
};//10+2
char占一个字节,偏移3个字节,是int的整数倍,short占两个字节,总共是10字节,但是结构体总大小必须是最长类型大小的整数倍,所以再偏移两个字节,一共为12个字节。
PS:struct C 和 srcuct D 存储的类型都是int,short和char类型,但是一个是8个字节,一个是12个字节,这就需要用户在定义时注意类型的排列问题,注意内存的使用空间。
struct II
{
int a;///4
char b;//1+3
};//8
struct I
{
float x;//4
struct II y;//8
};//12
struct II 的大小为8个字节,struct I 的大小为float(4)加上struct II 的大小(8)为12个字节。之所以不是16个字节是因为只需要遵循是最大单个类型的整数倍就可以了。