C语言计算结构体大小
计算结构体大小
结构体总大小必须为最大数据类型的倍数(如果为嵌套结构体则将被嵌套结构体里面的数据类型一起比较,从而找出最大的,而不是将被嵌套结构体视为一个整体。)
结构体首地址必须为最大数据类型倍数
每个成员起始地址必须为其大小的倍数
计算一个结构体大小时可以从地址0开始计算
struct Test1
{
int b;
double c;
long d;
}Test1;
int main()
{
printf("size = %d\n", sizeof(Test1));
return 0;
}
大小为24字节
计算流程:当计算结构体大小时,为了方便计算,初始地址假设为0,int占了4个字节,总开辟的空间为4,因为要和下面的double类型对齐,double的起始地址必须为8,所以绿色部分为因对齐而另开辟的空间,double占了8个字节,所以现在总开辟的是16个字节,long的字 节为4, 16是4的倍数,所以long的起始地址为16,long占了4个字节,此时共开辟了20个字节大小的空间。因为最后面没有类型了,结构体变量的总大小要根据结构体变量中最大基本数据类型对齐,20要跟8对齐,但是20不是8的整数倍,所以在long的后面再开辟4个字节,所以最后一共开辟了24个字节。
计算含有数组的结构体大小时,需要注意的是,如果下一个成员是数组,则不需要偏移,只要连续开辟空间。
typedef struct Test2
{
char c[9];
char ca[5];
int a;
}Test2;
int main()
{
printf("size = %d\n", sizeof(Test2));
return 0;
}
大小为20字节
计算流程:起始地址为0,char c[9]占了9个字节的空间,因为下一个成员也是数组,所以不用对齐,直接在地址9这里开辟一个数组char ca[5],占了5个字节,此时是占了14个字节,但是下一个成员是int类型,14不是4的整数倍,所以要从16地址开始存放int a,int占了4个字节,所以总开辟了20个字节,随后,结构体的总大小必须是结构体里最大基本类型的整数倍,这里为int 4个字节,20是4的整数倍,不用补齐,所以此结构体最总开辟了20个字节。
计算嵌套结构体的大小
如果为嵌套结构体则将被嵌套结构体里面的数据类型一起比较,从而找出最大的,而不是将被嵌套结构体视为一个整体。
typedef struct Test3
{
short a;
struct
{
int b;
double c;
long d;
};
int e;
}Test2;
int main()
{
printf("size = %d\n", sizeof(Test3));
return 0;
}
大小为40字节
计算流程:起始地址位置为0,short类型占了2个字节,下面的一个成员类型为结构体,此时要与嵌套的结构体里最大的基本类型,也就是和double 8字节对齐,所以另开辟空间6个,此时地址8是8的倍数,可以存放结构体,这里计算里面的结构体的大小为24,所以8+24=32,所以此时一共占了32个字节空间的大小,最后一个int类型,32是4的整数倍,所以int就直接存在结构体类型的后面,32+4=36,最后要和结构体最大的基本数据类型补齐,里面的结构体的类型也算。所以要与double 8补齐,36不是8的倍数,随后另开辟4个字节空间。所以最后结构体的总大小为40.

浙公网安备 33010602011771号