一、前言
结构体是C语言中的一种自定义数据类型,由关键字struct定义,该数据类型由一组成员组成。而由于结构体内成员数量“众多”,所以结构体的所占内存大小是如何规定的便成了我们今天要探讨的问题。
二、结构体内存大小演示
1.演示代码
#include <stdio.h>
struct Book
{
char name[20];
int price;
char id[10];
};
int main()
{
struct Book b1;
printf("%d\n", sizeof(b1));
return 0;
}
此段代码中输出的结果是什么呢??通过计算结构体内的成员变量可以得到34个字节的大小,但结果真的是34吗?
2.演示结果
由此可见,结果是36个字节,为什么会出现按照成员变量大小计算出的34个字节,而正确结果是36个字节这样的情况,这就涉及了结构体的内存对齐。
三、结构体的内存对齐
1.结构体内存对齐规则
- 结构体中第一个成员在结构体变量偏移量 0 出
- 其他成员变量对齐在对齐数的整数倍的地址处
对齐数=编译器默认对齐数 与 该成员大小 的 较小值 - 结构体总大小为最大对齐数的整数倍
- 如果出现嵌套结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍
2.对演示代码的解析
#include <stdio.h>
struct Book
{
char name[20];
int price;
char id[10];
};
int main()
{
struct Book b1;
printf("%d\n", sizeof(b1));
return 0;
}
根据此段代码,第一个成员char name[20] 从结构体偏移量0开始向后占用20个字节;第二个成员int price 占用4个字节的空间,对齐数是4,20刚好是4的倍数,因此int price 向后占用4个字节,此时占用24个字节;第三个成员char id[10] 对齐数是1,24是1的倍数,因此又向后占用10个字节。
该结构体成员变量从0到33一共占用了34个字节,而最大对齐数是4,34不是4的倍数,所以浪费2个字节,最后得出该结构体内存36个字节。
如下图所示:
|