Выражение должно быть изменяемым lvalue

typedef struct state1_s {
    u8 size;
    u8 state;
} state1_t;
typedef struct state2_s {
    u8 size;
    u8 state[2];
} state2_t;
typedef struct state3_s {
    u8 code;
    u8 count;
}state3_t;

У меня есть эти три структуры. Когда я делаю следующее

state1_t comp[8];
state2_t *avail;
state3_t *health;

&comp = (state1_t *)(&(avail->state[2])+1);

я получаю выражение должно быть изменяемой ошибкой lvalue.

Я получаю ту же ошибку, когда я делаю

&comp = (state1_t *)(&(heaalth->count) +1);

Как это исправить? Я хочу, чтобы адрес comp был в конце одной структуры. Как я могу это сделать?

2 ответа

Вы не можете изменить адрес массива. Вместо этого вы должны использовать указатель:

state1_t *comp;

Тогда вы можете сделать:

comp = (state1_t *)(&(avail->state[2]));

Вам не нужно добавлять 1 к адресу - state[2] это уже конец структуры, так как state[1] последний элемент этого массива.

state1_t comp[8];

В этой декларации comp это массив из 8 структур state1_t с базовым адресом массива comp который не может быть изменяемым. Следовательно, изменяемая ошибка lvalue при попытке изменить адрес comp,

Другие вопросы по тегам