关于结构体长度的问题-导致数据丢失

本文深入探讨了结构体变量中成员的地址偏移量计算规则以及存储变量地址的对齐原则。通过实例解析,阐述了编译器如何确保结构体成员偏移量为成员大小的整数倍以及结构体大小为所有成员大小的整数倍。当这些原则不满足时,编译器会自动调整以避免数据丢失,确保内存高效利用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关于偏移量

1.结构体变量中成员的地址偏移量为上一个成员的偏移量加上一个成员的大小
2.结构体大小等于最后一个成员的偏移量加上最后一个成员的大小。

关于存储变量地址对齐

编译器在编译程序时会遵循两条原则:
1、结构体变量中成员的偏移量必须是成员大小的整数倍(0被认为是任何数的整数倍)
2、结构体大小必须是所有成员大小的整数倍。

举例:
  struct ssd
  {
  float a; 地址偏移量 0(首地址)
  int b; 地址偏移量 4(0+4)
  char c; 地址偏移量 8(4+4)
  char d; 地址偏移量 9(8+1)
  float e; 地址偏移量 10(9+1)
  };
答:
  原则1:不满足,e地址偏移量10不是成员大小(4)的整数倍
  原则2:不满足,结构体大小为14不是所有成员大小(4/1)的整数倍
  故:编译器会自动为e补充2个空字节
  即 float e; 地址偏移量 12(9+1+2)
  原则1:满足,e地址偏移量12是成员大小(4)的整数倍
  原则2:满足,结构体大小为16是所有成员大小(4/1)的整数倍
  
总结:计算结构体长度时应注意结构体成员间数据对齐要求,如果单纯按照结构体成员大小计算会造成数据丢失。

参考:https://blog.youkuaiyun.com/jueduiwudi6/article/details/80721108?utm_medium=distribute.pc_relevant.none-task-blog-2defaultbaidujs_utm_term~default-0.no_search_link&spm=1001.2101.3001.4242.1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值