商城网站建设运营方案,网站建设维护是做什么的,甘肃省建设银行网站,进度圈wordpress文章目录 1 . 前言总结2 . 问题现象3 . 解决思路4 . 细节扩展5 . 总结 【极客技术传送门】 : https://blog.csdn.net/Engineer_LU/article/details/135149485 1 . 前言总结
有时候希望通过类定义的类型指向数据包来解析#xff0c;恰好又想结构体内定义指针指向一段数据… 文章目录 1 . 前言总结2 . 问题现象3 . 解决思路4 . 细节扩展5 . 总结 【极客技术传送门】 : https://blog.csdn.net/Engineer_LU/article/details/135149485 1 . 前言总结
有时候希望通过类定义的类型指向数据包来解析恰好又想结构体内定义指针指向一段数据那很常见不过有时候会忽略一个覆盖重叠的问题以下详述这个细节
2 . 问题现象
以下代码 Tuya_Ble_Rec-dat 指向数据段后希望可以通过下标来访问后续数据段但事实上访问数据对不上后续数据段为什么会这样呢 因为在 Tuya_Ble_Rec-dat 指向数据段之前结构体指针 Tuya_Ble_Rec 已经指向了整段数据段而整段数据段覆盖到了结构体内的指针变量因此当结构体内的指针变量又重新指向数据段后会把目标的地址覆盖了原数据段的数据而原数据段的数据就丢掉了变成了地址因此访问数据对不上后续数据段
typedef struct{u16 header;u8 version;u8 command;u16 len;u8 *dat;
}Tuya_Ble_Rec_str;Tuya_Ble_Rec (Tuya_Ble_Rec_str *)Chip_Uart.uart_rec_dat[0];
Tuya_Ble_Rec-dat (u8 *)Chip_Uart.uart_rec_dat[6];3 . 解决思路
为了解决以上问题可把结构体成员指针改成结构体成员数组当访问时目标数据段时用Tuya_Ble_Rec-dat[0]下标方式访问避免了地址覆盖数据问题
typedef struct{u16 header;u8 version;u8 command;u16 len;u8 dat[50];
}Tuya_Ble_Rec_str;Tuya_Ble_Rec (Tuya_Ble_Rec_str *)Chip_Uart.uart_rec_dat[0];4 . 细节扩展
除了上述情况再扩展思考地址与数据的关系中地址是编译过程分配的值是运行过程可变的地址是可以作为值来运算的因此在编程中尽量思考数据段不可被地址越界及覆盖影响
5 . 总结
C语言的精髓在于指针同时也造就了各种各样的陷进因此C语言是一种带有双刃剑属性的语言在编程中若是掌握了C语言如同司马迁拥有史笔若是运用不好就如同蛇蝎拥有毒液让人防不胜防因此熟练掌握C语言是嵌入式的重中之重谢谢观看。 技术交流群 : 745662457 群内专注 - 问题答疑技术研究