先通过两个实例来判断结构体大小:
1.
2.
.
可以提前计算一下该结构体的大小。
首先我们得掌握结构体内存的对齐规则:
1. 第一个成员在与结构体变量偏移量为0的地址处。
2.其他成员变量要对齐到对齐数的整数倍的地址处
对齐数=编译器默认的对齐数与该成员大小的较小值
3.结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍
4.如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍数,结构体的总大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍
声明:我使用的是vs编译器,该编译器默认偏移量为8,每个编译器默认的偏移量不同。
首先我们需要了解偏移量是什么
在内存中结构体第一个所指的起始位置就是偏移量为0的位置此时我们用该例子进行讲解
我们知道char与int分别占1个字节和4个字节,第一条规则说了第一个成员在与结构体变量偏移量为0的地址处。而char为一个字节所以 a 占一个字节此时内存为:
第二个类型为int 为4个字节,编译器默认的对齐数为8,按照第二条规则要对齐到编译器默认的对齐数与该成员大小的较小值所以此时的对齐数为4,所以int b此时要存储到偏移量为4的倍数,所以此时到偏移量为4的位置开始存储。
类似的下一个为char类型占一个字节编译器对齐数为8所以此时对齐数为1,所以此时char c在偏移量为1的倍数进行存储:
此时该结构体的大小为9个字节我们按照第三条规则:结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍,前面我们计算的对齐数分别为“1”, “4”,“1”所以结构体总大小为12
第二个也是类似的。
这是小编初学c语言的一些实践和总结。希望对大家有所帮助