【问题标题】:Passing an array/pointer into a stuct in c将数组/指针传递给c中的结构
【发布时间】:2015-09-28 18:03:08
【问题描述】:

我在 c 中有一个函数声明如下:

void SendMsg(TXMsg_t *TXMsg);

这是结构:

typedef struct
{
    uint16_t DestAddr;
    uint16_t PayloadLength;
    uint8_t Payload[512];
} TXMsg_t;

我可以手动填充TXMsg.Payload,调用SendMsg(&TXMsg);,效果很好。但在一种情况下,我有一个调用 SendMsg 的中间函数:

void main(void)
{
    uint16_t Addr = 0x1234;
    uint16_t TXLength = 0x0004;
    uint8_t TXData[4] = {0xAA, 0xBB, 0xCC, 0xDD};

    MiddleFunction(Addr, TXLength, TXData);
}

void MiddleFunction(uint16_t Addr, uint16_t TXLength, uint8_t *TXData);
{
    TXMsg_t TXMsg;

    TXMsg.DestAddr = Addr;
    TXMsg.PayloadLength = TXLength;
    TXMsg.Payload = TXData;        // This is the problem!!!

    SendMsg(&TXMsg);
}

这给了我一个错误:“赋值给具有数组类型的表达式”。

我的目标是简单地将 指针 指向 TXData 并将其传递给我的 SendMsg 函数。这是一个嵌入式应用程序,我不想花时间或内存来实际复制数据...

我该怎么做?

【问题讨论】:

  • memcpy(TXMsg.Payload, TXData, TXLength); 而不是 TXMsg.Payload = TXData;
  • 谢谢@BLUEPIXY,我编辑了这个问题,说我试图避免实际复制数据:)
  • 如果不更改TXMsg_t 类型的定义,就无法避免复制数据。 C 不允许数组作为赋值的左操作数。即使是这样,语义也需要是复制数据。不要混淆:虽然数组和指针在 C 中密切相关,但它们根本不是一回事。
  • @bitsmack 将 uint8_t Payload[512]; 更改为 uint8_t *Payload;

标签: c arrays pointers gcc


【解决方案1】:

您需要使用memcpy 将字节从一个数组复制到另一个数组。还需要在MiddleFunction中传入TXData数组的大小:

int main(void)   // main must return int
{
    uint16_t Addr = 0x1234;
    uint16_t TXLength = 0x0004;
    uint8_t TXData[4] = {0xAA, 0xBB, 0xCC, 0xDD};

    MiddleFunction(Addr, TXLength, TXData, sizeof(TXData));
}

void MiddleFunction(uint16_t Addr, uint16_t TXLength, uint8_t *TXData, int dataLen)
{
    TXMsg_t TXMsg;

    TXMsg.DestAddr = Addr;
    TXMsg.PayloadLength = TXLength;
    memset(TXMsg.Payload, 0, sizeof(TXMsg.Payload));   // zero out the array to start
    memcpy(TXMsg.Payload, TXData, dataLen);            // copy the bytes from the source array

    SendMsg(&TXMsg);
}

编辑:

如果不想复制数据,则需要重新定义结构,使Payload 是指针而不是固定数组。所以你会改变这个:

uint8_t Payload[512];

到这里:

uint8_t *Payload;

然后您可以按原样使用其余代码(您的结构已经包含一个长度字段,因此您不需要像我最初认为的那样传递额外的数据)。

【讨论】:

  • 太好了,你的编辑正是我想要的:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-21
  • 1970-01-01
  • 2021-11-02
  • 2019-05-03
相关资源
最近更新 更多