struct message {
uint8_t start;
uint16_t length;
uint8_t data[10];
uint8_t checkSum;
} __attribute__((packed));
struct message devices[10];
void request(struct message *msg) {
struct request *req = (struct request *)&msg->data;
req->operation = 1;
req->requesterAddress = MASTER_ADDRESS;
}
request(&devices[0]);
Мой вопрос: почему амперсанд в «& msg-> data»?
Насколько я понимаю, функция «запрос» получает указатель «msg» на структуру. msg->data извлекает указатель «данные» из структуры, на которую указывает «msg» («данные» — это массив), а затем приводит к другому типу указателя (запрос структуры *).
Так что эта часть должна быть (struct request *)msg->data; Итак, почему амперсанд (&)?
&msg->data
выражается как тип указателяuint8_t (*)[10]
, аmsg->data
выражается какuint8_t*
. Не то, чтобы это имело значение, так как вы выбрасываете тип независимо и приводите к желаемому выравниваниюstruct request *
. - person WhozCraig   schedule 11.04.2017uint8_t (*)[10]
, который не совпадает сstruct request *
(с большим отрывом).&
не нужен; тогда вы принуждаетеuint8_t *
кstruct request *
, что попадает в деликатную область по поводу «является лиuint8_t
типом персонажа», потому что псевдонимы между типами символов и другими допустимы (но многие другие преобразования — нет). И упаковка делает этот бросок еще более проблематичным. Ожидайте сбоев и других странных действий. - person Jonathan Leffler   schedule 11.04.2017