我已阅读所有其他问题,但回复对我帮助不大。 再说一遍,我不是开发人员,而是一名木工,试图制作一些对他自己的大脑而言过于复杂的东西。
我在 PIC 上工作,它的对齐方式是 4 个字节,所有结构都用属性定义((打包))。
我找到了一种方法来做到这一点,但它使用了 malloc 和 str/mem-cpy,这些方法对于中断来说不安全,或者对于我根本不应该使用的 malloc (参见我之前的问题) )
该结构包含 16 个无符号字符,1 个 s16(2 字节)和 3 个 s32(4 字节),因此其长度为 30 字节,4 字节对齐使其长度为 32 字节。 (字符以 8 位编码)。
1)到目前为止我错了吗?
int len =sizeof(data_out.point[i]);
unsigned char* raw;
raw = malloc(len);
memcpy(raw, &data_out.point[i], len);
Data_res[count].pData = malloc(len);
for (int k = 0; k<len; k++)
{
Data_res[count].pData[k] = (uint8_t)(raw[k]);
}
Data_res[count].DataLen=len;
count++;
}
data_out 是一个结构(除以下成员外,其他成员不相关) point 就是之前描述的结构。
Data_res 是一个存储 uchar 缓冲区 (pData) 的结构,包含长度和状态(锁定、写入等以避免多重访问)。
1)它不能100%工作,有时结果真的很奇怪。
2)从昨天起我明白了为什么它不好(在非共享内存上进行 malloc、转换 malloc、中断安全等)。
如何在没有 mallocs/memcpy 的情况下做同样的事情?
注意:我需要这个来进行调试输出,我本来打算让它过去,但我不喜欢让事情未完成......
最佳答案
- Don't cast the result of
malloc
in C.如果必须进行转换,则您使用的是 C++ 编译器,并且应该使用new
而不是malloc
。 sizeof
是一个运算符(不是函数),用于确定该类型对象的大小(作为size_t
,而不是int
),因此,如果data.point[i]
是char *
,则sizeof data.point[i]
与以下值相同sizeof (char *)
。假设 sizeof 决定了指针所指向的对象的大小,这是一个常见的错误。这适用于数组类型,但不适用于指针类型。- 当函数返回时,您正在泄漏
raw
指向的内存。您应该使用自动存储持续时间而不是动态分配。即unsigned char raw[len];
。 - 您应该执行独立于机器的序列化,例如如果您计划将此数据传输到其他机器,请将每个字段转换为不依赖于机器架构的值。
- 最后,为了回答您的问题,您可以替换
Data_res[count].pData = malloc(len);
的唯一方法似乎是您需要一些其他对象(请参阅上面的自动存储持续时间)来指向,即Data_res[count].pData = raw;
... 您可能需要在调用函数中声明raw
,以避免在函数调用时它被销毁您提供了返回。
关于c - 不使用 malloc/str 方法将结构转换为 unsigned char 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43269991/