You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何正确获取结构体末尾指针以调用自定义memCopy完成Flash到RAM拷贝

问题根因

你原来的end指针计算错误核心是指针算术的步长等于指针指向类型的字节数,不是按字节偏移。
你代码中&myStructInFlash是结构体类型的指针,直接加sizeof(myStructInFlash),相当于地址实际偏移了sizeof(myStructInFlash) * sizeof(myStructInFlash)字节,远超结构体本身的大小,地址溢出后就会得到类似0xFFFFFFFF的无效值。

对应闭区间memCopy的正确实现

你提供的memCopy通过srcStartAddr <= srcEndAddr做循环判断,要求传入的srcEndAddr是最后一个待拷贝uint16_t元素的地址,正确赋值代码如下:

uint16_t *start;
uint16_t *end; 
uint16_t *dest;

start = (uint16_t *)&myStructInFlash;
// 先计算结构体占多少个uint16_t单元,减1得到最后一个单元的偏移
end = start + (sizeof(myStructInFlash) / sizeof(uint16_t)) - 1;
dest = (uint16_t *)&myStructInRAM;

// 调用拷贝函数
memCopy(start, end, dest);

关于你提到的写法正确性判断

你提到的(uint16_t)((&myStruct + 1) - 1)写法是错误的,原因是&myStruct是结构体类型指针,加减运算的步长是整个结构体的大小,&myStruct +1之后再减1,最终得到的地址等于&myStruct本身,完全不符合要求。

如果要基于结构体尾地址实现计算,正确写法如下:

// &myStructInFlash + 1 得到结构体结束后的第一个地址,强转为uint16_t*后减1,刚好指向最后一个uint16_t地址
end = (uint16_t *)(&myStructInFlash + 1) - 1;

该写法和前面的偏移计算写法效果完全一致,你可以根据编码习惯选择。

内容的提问来源于stack exchange,提问作者Colm Murphy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 00:36:05