struct members使用循环赋值

时间:2013-10-26 21:56:11

标签: c loops struct variable-assignment

我有这样的结构

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?

4 个答案:

答案 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;
}