【问题标题】:Passing structs by void pointer in C在 C 中通过 void 指针传递结构
【发布时间】:2012-05-22 18:58:16
【问题描述】:

我正在尝试实现 ARM/DSP 共享内存通信。 ARM 端将一个数据块放在共享内存上(我们将其命名为 array[]),并将块的地址和大小发送到 DSP 端,DSP 端只是读取它们。 在 DSP 方面,

void * buf //address of block on shared memory
int length //size of block

但是,当我尝试阅读它们时,我得到的实际上是:

buf[0] = length
buf[1] = array[1]
buf[2] = array[2]
buf[3] = array[3]
    :
    :
    :

看起来好像长度变量覆盖了数组的第一个单元格(这有点奇怪),或者我以错误的方式使用了 void 指针。 有什么建议吗?

【问题讨论】:

  • 你能显示 proc,你把这些数据发送到哪里?你如何发送地址、长度、数组单元格的大小?
  • 这个过程很难描述,因为它是一个使用内置 API 的完整 DSP/BIOS LINK 实现。 ARM 端使用 Pool_writeback() 函数发送数据,并将地址从 POOL_translAddr() 从一个地址空间转换到另一个地址空间。发送到 DSP 的是块的起始地址和长度,它们分别存储在 buf 和 length 中。该链接似乎工作正常(针对 "int buf" 进行了测试)。这种使用 void 可以接受吗?如果 buf[1] 具有正确的值并且 buf[0] 具有直接在 buf 之后分配的变量,那可能是我的 C 代码中的错误吗?
  • 在你的代码“buf[3] = array[0]”中它是不是错误(buf[3] = array[2])?

标签: memory pointers struct allocation void


【解决方案1】:

我认为,该数据结构是:

buf[0] = length
buf[1] = array[0]
buf[2] = array[1]
:
buf[length] = array[lenght-1]

而且你必须为长度+1保留buf

【讨论】:

  • 如果是关于分配内存,那么我可能会遇到数组末尾而不是开头的问题,对吗? Buf 应该指向数组而不是长度变量。发送的内存块是 struct { int rows int cols int array[200] }datastr 的结构,长度为 202 个整数。 808 字节。并且由于 datastr 的地址存储到 buf 不应该是 buf[0] = rows buf[1] = cols buf[3] = array[0] ... 而不是 buf[0] = buf[1] = cols ... ?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多