结构体内存对齐
规则:一个结构体有三个成员,分别是char、int、short类型,三个成员位于结构体中不同位置时整个结构体的大小可能是
#include <stdio.h>
struct s1{char a; int b; short c;};
struct s2{char a; short c; int b;};
struct s3{int b; char a; short c;};
struct s4{int b; short c; char a;};
struct s5{short c; int b; char a;};
struct s6{short c; char a; int b;};
int main()
{
printf("char int short 排列大小 = %ld \n", sizeof(struct s1)); // char占1个字节,int占4个字节,1个字节存储不下,扩充为4个字节,short2个字节,填充2个字节
printf("char short int 排列大小 = %ld \n", sizeof(struct s2)); // char 和short+1共占4个字节,int独占一个4位的字节
printf("int char short 排列大小 = %ld \n", sizeof(struct s3)); // int 独占4个字节,char 和short+1共占一个4位字节
printf("int short char 排列大小 = %ld \n", sizeof(struct s4));
printf("short int char 排列大小 = %ld \n", sizeof(struct s5));
printf("short char int 排列大小 = %ld \n", sizeof(struct s6));
return 0;
}
输出结果
char int short 排列大小 = 12
char short int 排列大小 = 8
int char short 排列大小 = 8
int short char 排列大小 = 8
short int char 排列大小 = 12
short char int 排列大小 = 8
一个结构体中含有相同的成员,排列顺序不同,就有不同的大小。
举s1的例子:假设有一块20个字节的连续内存空间
char 存入占一个字节,int存入占4个字节,然后因为内存对齐的原因,char后面需要补充3个空,占4个字节位,short后面补充2个空。