C语言中如何为指针添加偏移 单片机固件RxBuff解析适配问题
地址匹配逻辑校验
原ParseData的固定执行规则是:不管传进来的缓冲区指针是多少,内部固定从指针值 + 1字节偏移的位置开始解析有效数据。
三个接收缓冲区的有效解析起点(也就是字符串里首字符'D'的内存地址)分别是:
RxBuffer1:存储内容为#DATA...,第一个字节是不参与解析的#,有效起点是&RxBuffer1[1]RxBuffer2:存储内容为DATA...,没有前置的#,有效起点是&RxBuffer2[0]RxBuffer3:结构和RxBuffer1完全一致,有效起点是&RxBuffer3[1]
调用方式验证
你猜测的ParseData(RxBuffer2 - 1)的计算逻辑是完全匹配解析规则的:
按照内部规则,传入参数为xAddr时,实际解析起点是xAddr + 1。当传入值为RxBuffer2 - 1时,内部解析落点为(RxBuffer2 - 1) + 1 = RxBuffer2,刚好对准RxBuffer2的有效数据起点,与RxBuffer1、RxBuffer3传入原缓冲区首地址后的解析落点完全对齐。
因为操作的是char*类型指针,指针单步加减的偏移量天然就是1字节,和内部的偏移计算维度完全一致,不会出现类型错配的问题。
必须规避的风险点
- 需要确认
RxBuffer2 - 1指向的内存是MCU地址空间内合法可访问的区域:虽然当前解析层级不会读取这个位置的字节(#标识不参与当前解析),但如果后续迭代解析逻辑、不小心新增了判断缓冲区首字节的分支,会直接读取该偏移位置的内存,可能触发硬Fault,或者读到随机值导致逻辑异常。 - 怕踩内存的话,最简单的改造就是把
ParseData里写死的+1偏移抽成可传入的参数,调用时按每个缓冲区的实际偏移传值即可:- 调用
RxBuffer1时传偏移量1 - 调用
RxBuffer2时传偏移量0 - 调用
RxBuffer3时传偏移量1
这种方式不需要做指针前后移动的操作,不管是安全性还是可维护性都高很多。
- 调用
内容的提问来源于stack exchange,提问作者E_Blue
相关产品推荐
相关产品推荐

