c - 不使用 malloc/str 方法将结构转换为 unsigned char 数组

标签 c arrays pointers

我已阅读所有其他问题,但回复对我帮助不大。 再说一遍,我不是开发人员,而是一名木工,试图制作一些对他自己的大脑而言过于复杂的东西。

我在 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 的情况下做同样的事情?

注意:我需要这个来进行调试输出,我本来打算让它过去,但我不喜欢让事情未完成......

最佳答案

  1. Don't cast the result of malloc in C.如果必须进行转换,则您使用的是 C++ 编译器,并且应该使用 new 而不是 malloc
  2. sizeof 是一个运算符(不是函数),用于确定该类型对象的大小(作为 size_t,而不是 int ),因此,如果 data.point[i]char *,则 sizeof data.point[i] 与以下值相同sizeof (char *)。假设 sizeof 决定了指针所指向的对象的大小,这是一个常见的错误。这适用于数组类型,但不适用于指针类型。
  3. 当函数返回时,您正在泄漏 raw 指向的内存。您应该使用自动存储持续时间而不是动态分配。即unsigned char raw[len];
  4. 您应该执行独立于机器的序列化,例如如果您计划将此数据传输到其他机器,请将每个字段转换为不依赖于机器架构的值
  5. 最后,为了回答您的问题,您可以替换 Data_res[count].pData = malloc(len); 的唯一方法似乎是您需要一些其他对象(请参阅上面的自动存储持续时间)来指向,即 Data_res[count].pData = raw;... 您可能需要在调用函数中声明 raw,以避免在函数调用时它被销毁您提供了返回。

关于c - 不使用 malloc/str 方法将结构转换为 unsigned char 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43269991/

相关文章:

c - 从文件中读取字符串到C中动态分配的数组

c - OpenPBS 构建错误 - 未知类型名称 'jid_t'

c - 当从单独的线程调用时,如何从 fgets 获得正确的输出?

c - 如何验证目标文件是由 g++ 而不是 gcc 生成的

c++ - 可以使用 union 将 char 数组转换为 float 吗?

arrays - 堆与二叉树-如何实现?

c++ - (void*) 和 (void(*)(argument type)) cast 之间有什么区别?

c++ - 为什么不能显示指针的地址?

javascript - jQuery animate 从关联数组中获取当前值

Python:列表与 np.array:切换到使用某些属性