【问题描述】
结构体在内存中是如何排列的?是像数组一样占用连续的内存空间吗?我们通过具体的例子来看一下。
【示例代码】
#include <stdio.h>
#include <stdlib.h>
struct Test {
char a;
int b;
char c;
};
int main() {
struct Test t;
printf("&t=%p\n", &t);
printf("&t.a=%p\n", &t.a);
printf("&t.b=%p\n", &t.b);
printf("&t.c=%p\n", &t.c);
printf("sizeof(t)=%d\n", sizeof(t));
system("pause");
return 0;
}
【运行结果】
因为最终的结果并不是6,所以我们可知结构体并不是按照像数组那样占用连续的内存空间,简单的成员相加。而是每个成员都占用了四个字节,a和c各浪费了3个字节。
接下来我们看看结构体的对齐规则:
1、第一个成员在与结构体变量偏移量为0的地址处。例:&t=&t.a
2、其它成员变量要对齐到某个数字(对齐数)的整数倍的地址处。
对齐数=编译器默认的一个对齐数与该成员大小的较小值。VS中默认值为8,Linux中默认值为4。
3、结构体总大小为最大对齐数(每个成员都有一个对齐数)的整数倍。
4、如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。
看一个具体的题目:
struct Test {
char a;
short b;
int c;
double d;
int e;
char f;
};
最终的结构体大小是多少?
最终结果是24.