我试图无线传输数据。我的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);
我在这里缺少什么?
感谢您的帮助。
答案 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 的评论中提到的,如果你做最终使用free
和malloc
,那么你需要制作确保您的平台(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或一些未初始化的指针。