Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Объявление переменной

2.6K
01 августа 2005 года
NinthBit
43 / / 31.01.2005
 
Код:
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 или что-либо другое?
3
01 августа 2005 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by NinthBit
 
Код:
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 или что-либо другое?



Для создания объектов переменной длинны.
Выделяется память под "заголовок" объекта (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;

Знаете кого-то, кто может ответить? Поделитесь с ним ссылкой.

Ваш ответ

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог