我有这样的结构
struct hour_parameters{
uint8_t VALUE_00;
uint8_t VALUE_01;
uint8_t VALUE_02;
uint8_t VALUE_03;
uint8_t VALUE_04;
uint8_t VALUE_05;
uint8_t VALUE_06;
uint8_t VALUE_07;
uint8_t VALUE_08;
uint8_t VALUE_09;
uint8_t VALUE_10;
uint8_t VALUE_11;
uint8_t VALUE_12;
uint8_t VALUE_13;
uint8_t VALUE_14;
uint8_t VALUE_15;
uint8_t VALUE_16;
uint8_t VALUE_17;
uint8_t VALUE_18;
uint8_t VALUE_19;
uint8_t VALUE_20;
uint8_t VALUE_21;
uint8_t VALUE_22;
uint8_t VALUE_23;
};
struct hour_parameters hparam;
我想分配一个uint8_t x[24]
hparam
,如何使用for循环执行此操作
hparam.value00 = x[0];
hparam.value01 = x[1];
and so on?
答案 0 :(得分:4)
你真的应该在你的结构中使用数组但是......
#include <string.h>
memcpy(&hparam, x, sizeof(hparam));
(我现在正躲在桌子底下)
这是危险的原因之一是结构中可能的填充。现在, 因为它们都是字节,所以你很安全。但是,从技术上讲,这种 东西不合法。你可以做的一件事是
assert(sizeof(hparam) == sizeof(x));
如果你坚持使用for循环:
for(int i = 0; i != sizeof(hparam); i++) {
((uint8_t *)&hparam)[i] = x[i];
}
哪个丑陋而且也不太犹豫。 Kerrek在下面的评论提出了不这样做的理由。
答案 1 :(得分:1)
这应该有效:
memcpy_s( &hparam, sizeof hparam, x, sizeof x )
虽然这不是很好的代码。
请注意,您的结构等同于数组,因此更好的解决方案是:
uint8_t hparam[24] = {0};
memcpy_s( hparam, sizeof hparam, x, sizeof x );
答案 2 :(得分:1)
正如@Charlie Burns指出的那样,你想试着避免它 除非您确切知道结构是如何填充/对齐的。 它不是便携式编码风格。
您还可以执行结构分配,例如
hparams = *(struct hour_parameters *)x;
答案 3 :(得分:1)
正如Charlie Burns所说,您可以将此结构用作数组,为了安全起见,如果编译器支持1
pragma pack
#include <stdio.h>
#include <stdint.h>
#include <string.h>
#pragma pack(push,1)
struct hour_parameters{
uint8_t VALUE_00;
uint8_t VALUE_01;
uint8_t VALUE_02;
uint8_t VALUE_03;
...
};
#pragma pack(pop)
int main(void)
{
struct hour_parameters hparam;
uint8_t x[24] = {0};
memcpy(&hparam, x, 24);
printf("%u\n", hparam.VALUE_12);
return 0;
}