为什么文档中,最后部分的邮箱例程中,使用消息结构体,一定要进行分配内存的操作,这样做意义是什么,我一旦注释掉分配内存的这一行,编译没有警告和报错,但程序会运行到故障处理程序。
邮箱可以理解成值传递。
为什么这样说?
如果是这样定义:
struct msg
{
rt_uint8_t* data_arr;
rt_uint32_t data_len;
};
那么你通过邮箱发送的消息体的真实有效数据是data_arr指针指向的数据,试想下,如果这个data_arr指针都没有指向空间(无论是全局的数据空间还是malloc出来的堆空间),自然接收方去访问这个data_arr的时候很大概率是出异常的。
与此形成对比的是,如果消息体这么定义:
struct msg
{
rt_uint8_t data_arr[128];
rt_uint32_t data_len;
};
这样的话,就不需要额外去申请空间了,因为这个msg中的data_arr本身就带了128字节的数组,它就可以用来存放真实的消息体数据。
那为何要定义成指针而不是数组呢?
原因是在邮箱传递消息时,数据长度是sizeof(struct msg),这样的话,使用数组定义比使用指针定义,size就大很大了,而且一定是数组定义,这个data_arr是定长的,不能超过定义的最大长度,使用上不够灵活。
以上答案,希望能解决你的困惑。
一、出错肯定的—-(大概率:内存越界)
1.struct msg* msg_str1;这条语句的意思是定义声明了一个邮结构体的指针,大小4字节,其中存放的是地址数据;重点是没有具体的结构体内存空间的!!!之后需要你进行申请;
2.之后出错;你是否在接收函数中处理了结构体指针msg_str1;但是要注意,因为没有申请真正的内存空间,所以在进行访问的时候就内存越界了。
感谢指点,问题已经搞明白了