Указанная проблема c вызвана тем, что вы по-прежнему обращаетесь к пустому указателю вместо структурного указателя A
. Вся причина, по которой вы создали A
, должна быть для этой цели, поэтому просто сделайте A->x1 = X1;
.
Однако, это излишне сложно. Поскольку обе структуры имеют одинаковые члены и просто разные имена переменных, это идеальный случай для union
, что означает, что члены структуры могут быть размещены вместе с перечислением, а не где-то еще. Со стандартным C вы можете сделать это:
typedef enum { A, B } choose_val_t;
typedef union
{
struct
{
uint16_t x1;
uint8_t x2;
uint8_t* x3;
};
struct
{
uint16_t y1;
uint8_t y2;
uint8_t* y3;
};
} ab_t;
typedef struct
{
choose_val_t val;
ab_t ab;
} gen_t;
void readStruct(gen_t* out, choose_val_t val, uint16_t X1)
{
out->val = val;
switch(val)
{
case A: out->ab.x1 = X1; return ;
case B: /* something */ return ;
}
}