我有一个数组
$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。
答案 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
具有相同的表示。