补充:结构体大小

为了加快对结构体成员的访问,编译器对结构体进行内存对齐,结构体大小往往大于成员字节数的总和。

结构体大小计算原则

1. 确定每个成员的字节数
2. 第一个成员在结构体偏移量为0的位置(起始下标从0开始)
3. 当前成员的偏移量是当前成员所占大小的整数倍(即当前成员的起始下标%sizeof(当前成员)== 0)
4. 结构体总大小是成员最大字节数的整数倍

struct Test {
    int id;                // 4
    char name[5];   // 5
    char age;          // 1
};
printf("%d\n", sizeof(struct Test)); // 12

步骤:
1. int: 0(偏移)+ 4(字节)
2. char [5]: 0(偏移)+ 4(字节)+ 1(偏移) + 5(字节)
3. char:0(偏移)+ 4(字节)+ 1(偏移) + 5(字节)+ 0(偏移)+ 1(字节)= 11
4. 最大字节数是4,要补充1个才是4的整倍数,所以是12

测试

struct Test {
char age; // 1
int id; // 4
char name[5]; // 5
};
printf("%d\n", sizeof(struct Test)); // 16
步骤:
1. char: 0(偏移)+ 1(字节)
2. int: 0(偏移)+ 1(字节)+ 3(偏移) + 4(字节)
3. char [5]:0(偏移)+ 1(字节)+ 3(偏移) + 4(字节)+ 2(偏移)+ 5(字节)= 15
4. 最大字节数是4,要补充1个才是4的整倍数,所以是16

struct Test {
char name[5]; // 5
char age; // 1
int id; // 4
};
printf("%d\n", sizeof(struct Test)); // 12
步骤:
1. char [5]: 0(偏移)+ 5(字节)
2. char: 0(偏移)+ 5(字节)+ 0(偏移) + 1(字节)
3. int:0(偏移)+ 5(字节)+ 0(偏移) + 1(字节)+ 2(偏移)+ 4(字节)= 12

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值