c - 如何获得指向结构末尾的指针?

标签 c pointers embedded

我有一个来自 TI motorware 项目的自定义 memCopy() 函数。 该函数采用起始地址指针、结束地址指针和目标地址指针。

void memCopy(uint16_t *srcStartAddr,uint16_t *srcEndAddr,uint16_t *dstAddr)

我想使用此函数将结构从 Flash 复制到 RAM 中该结构的副本。 我正在尝试将这些地址保存为如下指针。

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

start = (uint16_t *)&myStructInFlash;
end = (uint16_t *)(&myStructInFlash + (sizeof(myStructInFlash)));
dest = (uint16_t *)&myStructInRAM;

当我在调试器中逐步执行代码时,开始和目标指针看起来是正确的,但结束指针是垃圾。我想像 0xFFFFFFFF 这样的东西,反正对我来说它没有意义。

我认为问题出在我的“地址算法”上。 有没有正确的方法来做到这一点?

提前致谢, 冷

跟进:

太好了,谢谢伊恩。我不知道指针算法是这样工作的。

正如其他人提到的关于包容性与独占最后地址......功能如下

void memCopy(uint16_t *srcStartAddr,uint16_t *srcEndAddr,uint16_t *dstAddr)
{

  while(srcStartAddr <= srcEndAddr)
    { 
      *dstAddr++ = *srcStartAddr++;
    }

  return;
}

据此,我认为它需要“最后一个 uint16_t”,而不是 (&myStruct + 1) 之后产生的 uint16_t。

在那之前我如何获得 uint16_t? (uint16_t)((&myStruct + 1) - 1) ?

最佳答案

指针和整数的相加按指针的取消引用类型的大小放大。因此,要找到刚好超过对象末尾的地址,请将 &“address of”运算符作用于对象的地址加 1:

  • &myStructInFlash 指向myStructInFlash的开头。
  • &myStructInFlash + 1 点刚好超过 myStructInFlash 的结尾。

此外,两个兼容类型的指针的减法按指针的解引用类型的大小缩小,因此:

  • 表达式 (&myStructInFlash + 1 - &myStructInFlash) == 1 为真。

如果这些地址被转换为 char *(或其他一些窄字符指针类型),那么由于 sizeof(char)==1 根据定义为真:

  • (char *)&myStructInFlash 指向myStructInFlash的第一个字节。
  • (char *)(&myStructInFlash + 1) 指向刚好超过 myStructInFlash 末尾的字节。
  • 表达式 (char *)&myStructInFlash + sizeof(myStructInFlash) == (char *)(&myStructInFlash + 1) 为真。
  • 表达式 (char *)(&myStructInFlash + 1) - (char *)&myStructInFlash == sizeof(myStructInFlash) 为真。
uint16_t *start;
uint16_t *end; 
uint16_t *dest;

start = (uint16_t *)&myStructInFlash;
end = (uint16_t *)(&myStructInFlash + 1);
dest = (uint16_t *)&myStructInRAM;

注意:为使上述代码正确,&myStructInFlash&myStructInRAM 必须适当对齐以转换为 uint16_t *,并且 sizeof(myStructInFlash) 必须是 _Alignof(uint16_t) 的倍数。此外,memCopy() 无疑会要求 (char *)end - (char *)startsizeof(uint16_t) 的倍数.


编辑:根据 OP 的评论,end 实际上应该指向数据的最后一个 uint16_t,而不仅仅是结束的数据,所以分配给 end 应该是:

end = (uint16_t *)(&myStructInFlash + 1) - 1;

关于c - 如何获得指向结构末尾的指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69013525/

相关文章:

c - C代码中MAC地址的表示

c - 结构中的静态变量位于何处?

arrays - Go 中的不安全指针 : function call end kills array

c - 我如何通过网络代理 mmap 读取和写入?

c - 如何理解这个用于 PowerPC stwbrx 的 GNU C 内联汇编宏

c - 没有将分配内存的实际大小获取到指针

c - 两个if后休息一下

c - 指针数组

c - const 数组变量的运行时异常

c++ - 将结构内的二维数组传递给另一个结构