怎么把一个结构体中的数据复制到另一个相同类型的结构体数组中

struct BACnet_Device_Address
{
uint8_t mac_len;
uint8_t mac[MAX_MAC_LEN];
uint16_t net;
uint8_t len;
uint8_t adr[MAX_MAC_LEN];
};
typedef struct BACnet_Device_Address BACNET_ADDRESS;
BACNET_ADDRESS dest;
BACNET_ADDRESS *P_dest[50];
怎么把结构体dest的数据复制到结构体P_dest[50]中?
或者我这样定义有问题吗?BACNET_ADDRESS *P_dest[50];
我直接定义为结构体数组,然后P_dest[i]=dest,没能复制成功,不知道怎么回事

第1个回答  2015-07-24
可以类似BACNET_ADDRESS *P_dest[50];这样定义, 但要注意这样声明的是一个指针数组,即存50个BACNET_ADDRESS指针的数组,与你的需求不符。应该是直接定义BACNET_ADDRESS P_dest[50];这样P_dest中才能存储结构体
C语言中结构体不能直接整体赋值。
可以使用memcpy函数:
void *memcpy(void *dest, const void *src, size_t n);
其中dest就是需要赋值到的地址, src就是复制源, n是需要复制的字节数。
所以是 memcpy(&P_dest[i], &dest, sizeof(dest));

修正:好吧,又查了下C是支持结构体直接赋值的,但如果结构体中有指针,将是非常不安全的,不过就你的代码来看是没问题的。

你代码不能复制的原因是两者的类型不一致,就是最开始说的P_dest实际上是一个指针数组,而赋值时要把一个结构体赋值给指针导致的错误。只要改下P_dest的声明就成了。追问

试了一下,没能复制过去啊

追答

那用memcpy试试, 我这边测试简单的结构体是可以直接赋值的,你的比较复杂就没测试。 顺便问下,没能复制过去是值不对还是就直接报错退出了?

追问

是直接啥也没有,我定义成指针反而有,就是运行过去就清空了,不知道怎么回事

追答

把你复制的那行或者那段代码发出来瞧下?
不应该什么都没有的。
试试复制完了之后立刻printf出来看下是不是复制成功了?

本回答被网友采纳
相似回答