C语言 如何计算结构体的大小
Posted WhiteShirtI
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言 如何计算结构体的大小相关的知识,希望对你有一定的参考价值。
无嵌套结构体的大小计算
如何计算结构体的大小?
由于存储变量地址对齐的问题,计算结构体大小的3条规则:
1、结构体变量的首地址,必须是结构体变量中的“最大基本数据类型成员所占字节数”的整数倍。(对齐)
2、结构体变量中的每个成员相对于结构体首地址的偏移量,都是该成员基本数据类型所占字节的整数倍。(对齐)
3、结构体变量的总大小,为结构体变量中“最大基本数据类型成员所占字节数”的整数倍(补齐)
计算下面结构体的大小
struct Test1
int b;
double c;
long d;
Test1;
int main()
printf("size = %d\\n", sizeof(Test1));
return 0;
计算流程:当计算结构体大小时,为了方便计算,初始地址假设为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[10];
char ca[5];
int a;
Test2;
int main()
printf("size = %d\\n", sizeof(Test2));
return 0;
计算流程:起始地址为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;
计算流程:起始地址位置为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.
程序运行结果
如有疑问或者其它更好的方法,可以在下面评论区留言
以上是关于C语言 如何计算结构体的大小的主要内容,如果未能解决你的问题,请参考以下文章