typedef struct {
uint8_t byId;
uint16_t usLen;
union {
uint32_t uData[0];
uint16_t usData[0];
uint8_t byData[0];
} u;
} IOCTRL, *PIOCTRL;
Объявление переменной
Код:
В чем смысл объявления uint32_t uData[0] ?
Почему не просто uint32_t uData или что-либо другое?
Цитата:
Originally posted by NinthBit
В чем смысл объявления uint32_t uData[0] ?
Почему не просто uint32_t uData или что-либо другое?
Код:
typedef struct {
uint8_t byId;
uint16_t usLen;
union {
uint32_t uData[0];
uint16_t usData[0];
uint8_t byData[0];
} u;
} IOCTRL, *PIOCTRL;
uint8_t byId;
uint16_t usLen;
union {
uint32_t uData[0];
uint16_t usData[0];
uint8_t byData[0];
} u;
} IOCTRL, *PIOCTRL;
В чем смысл объявления uint32_t uData[0] ?
Почему не просто uint32_t uData или что-либо другое?
Для создания объектов переменной длинны.
Выделяется память под "заголовок" объекта (byId, usLen) и массив определенной длины. Эта длина записывается в соотв поле (usLen). Т.о. получается, что объект содержит массив, к примеру uData, некоторой определенной в usLen длины. Это удобно, когда данные должны лежать вмете одним скопом в памяти.
Код:
const uint16_t uDataLen = 10;
// создание
PIOCTRL p = (PIOCTRL)malloc(sizeof(IOCTRL::byId) + sizeof(IOCTRL::usLen) + sizeof(uint32_t) * uDataLen);
p->usLen = uDataLen;
// обращение к элементу массива
p->u.uData[2] = 5;
// создание
PIOCTRL p = (PIOCTRL)malloc(sizeof(IOCTRL::byId) + sizeof(IOCTRL::usLen) + sizeof(uint32_t) * uDataLen);
p->usLen = uDataLen;
// обращение к элементу массива
p->u.uData[2] = 5;