Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在c语言中将数组/指针传递给stuct_C_Arrays_Pointers_Gcc - Fatal编程技术网

在c语言中将数组/指针传递给stuct

在c语言中将数组/指针传递给stuct,c,arrays,pointers,gcc,C,Arrays,Pointers,Gcc,我在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) {

我在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
将字节从一个数组复制到另一个数组。您还需要在
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;

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

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