将Array复制到C中的Struct成员

时间:2014-03-13 16:14:53

标签: c arrays struct microcontroller avr-gcc

我试图无线传输数据。我的payload-struct看起来像这样:

typedef struct
{
   uint8_t data[3];
} data_t

我的代码中也有一个数组:

uint8_t data_to_be_copied[3];

如果我尝试简单地互相分配,我会收到以下错误:

msg->data = data_to_be_copied;
分配到类型' uint8_t [3]'时,

不兼容的类型来自类型' uint8_t *'

使用for-loop我的微控制器崩溃了:

for (int i = 0; i < 3; i++) {
  msg->data[i] = data_to_be_copied[i];
}

当我尝试使用memcpy时也是如此:

memcpy(msg->data, data_to_be_copied, 3);

我在这里缺少什么?

感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

msg->data是一个数组。

因此,它没有l值,你无法改变它。

这就是为什么您为上述第一个选项收到编译错误的原因。

对于上面提到的第二个和第三个选项,您在运行时遇到内存访问冲突,可能是因为您的msg变量未初始化为指向有效的内存地址。

假设您在正确的位置声明了data_t* msg,您仍需要初始化它:

data_t* msg = (data_t*)malloc(sizeof(data_t));

您还应确保在执行程序的过程中free(msg)

顺便说一句,您尚未指定程序的整个结构,但简单的data_t msg实例可能足以满足您的需求(在这种情况下,您不需要使用{{1} }和malloc)。

正如 @Shahbaz 的评论中提到的,如果你最终使用freemalloc,那么你需要制作确保您的平台(OS或BSP)支持动态内存分配(AKA )。

答案 1 :(得分:0)

你有一些可能性:

memcpy(msg-&gt; data,data_to_be_copied,3);

或将data_to_be_copied更改为

data_t data_to_be_copied;

并分配整个事物:* msg = data_to_be_copied

或者如果msg实际上有更多成员,则声明一个具有三个字符数组的结构作为其唯一成员。

如果它崩溃了,那么很可能msg是NULL或一些未初始化的指针。