【问题标题】:structure cast into unsigned char array without malloc/str methods在没有 malloc/str 方法的情况下将结构转换为 unsigned char 数组
【发布时间】:2017-04-07 05:00:34
【问题描述】:

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

我在 PIC 上工作,它的对齐是 4 个字节,所有结构都用 attribute((packed)) 定义。

我找到了一种方法,但它使用 malloc 和 str/mem-cpy,这些方法对于中断或我根本不应该使用的 malloc 不安全(参见我之前的问题)

所述结构包含 16 个无符号字符,一个 s16(2 个字节)和三个 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 是一个结构(成员不相关,除了以下一个) 点是前面描述的结构。

Data_res 是一个存储 uchar 缓冲区 (pData) 并包含长度和状态(锁定、写入等以避免多访问)的结构。

1) 它不能 100% 工作,有时结果真的很奇怪。

2) 从昨天开始我就明白它为什么不好了(malloc 在非共享内存上,强制转换 malloc,中断安全等)。

如何在没有 malloc/memcpy 的情况下做同样的事情?

注意:我需要这个来调试输出,我本来打算放手的,但我不喜欢让事情未完成......

【问题讨论】:

标签: c arrays pointers


【解决方案1】:
  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 在调用函数中,避免在你提供的函数返回时被销毁。

【讨论】:

  • 1) 我从昨天就知道了,我只是提供了我正在使用的代码。 2) data.point[i] 是一个结构 3) raw 被传递给 free,我在粘贴代码时错过了它,将修复帖子,感谢您指出它 4) 它传递给在上运行的不同硬件相同的图片和相同的软件(冗余) 5)我会尝试在启动时初始化 Data_res[count].pData,谢谢
  • 我删除了这个方法,只是将结构重铸成一个指针,在它被调用的地方。它可能并不优雅,但它可以工作
猜你喜欢
  • 2011-02-19
  • 1970-01-01
  • 1970-01-01
  • 2022-12-15
  • 2011-12-14
  • 2017-04-05
  • 2015-07-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多