将uint8数组转换为结构数组而不是memcpy它

时间:2018-01-04 18:53:20

标签: c arrays casting embedded memcpy

我有一个数组

$request->request->set('Key',$value)

我正在使用

uint8_t b[size];

将b数组的内容复制到结构数组中。 通过这样做我有问题,我需要分配2倍我需要的字节。 假设ds是"打包"是否安全地转换b数组?通过这样做?

struct data_status ds[size / sizeof(struct data_status)];
memcpy(ds, b, size);

我是否必须特别注意某些事情?

上面的代码尚未经过测试,我还处于思考阶段。

这样做真的可以节省空间吗?我想不,因为必须声明ds,最好的想法是使用以下内容: 无论我在哪里使用

ds = (struct data_status*)&b;

我用

ds[i].a;

EDIT1:size确实是sizeof(struct data_status)的倍数

EDIT2:谢谢你的回答,但我注意到我还没有完全解释你的目的。

我想要实现的是从闪存中读取某些地址之间的内容,API强制我使用uint8_t指针(或数组)。闪存中写入的内容是我之前使用预定义数据结构编写的内容。 上面的代码只是检索内存的内容,然后我必须approprietly解释它们(使用data_status)。 显然阵列" b"在它达到目的后就会死去,最好的事情就是如果" b"要么被删除要么开始,要么直接成为data_status。

2 个答案:

答案 0 :(得分:3)

避免施法。使用union将数据存储在" byte"表格和struct data_status表格。

_Static_assert(size % sizeof(struct data_status) == 0, "bad size");

union {
  struct data_status ds;
  uint8_t b[sizeof (struct data_status)];
} u[size / sizeof(struct data_status)];

答案 1 :(得分:2)

你这样做是错误的。将字符数组转换为其他类型是危险的,因为它可能与目标类型的对齐方式不同。因此,这通常是不允许的,程序的行为是不确定的。 可以的坏事会发生。

反过来说,从另一种类型转换为字符类型是好的,字符类型是特殊的。所以就这样做:

struct data_status ds[size / sizeof(struct data_status)];
unsigned char* b = (unsigned char*)ds;

并做任何你认为必须逐字逐句的事情。

顺便说一句,如果uint8_t存在,则它必须与unsigned char具有相同的表示。