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

我有一个来自 TI 电机项目的自定义 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根据定义,since为真:

  • (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 *)start是 的倍数sizeof(uint16_t)


编辑:根据 OP 的评论,end实际上应该指向uint16_t数据的最后一个,而不仅仅是数据的末尾,因此分配给end应该是:

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

以上是如何获得指向结构末尾的指针?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>