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

Ваш аккаунт

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

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

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

char Buffer[1]?

3.0K
22 августа 2008 года
Oxaid
63 / / 02.04.2006
Привет!
Читая MSDN, я тут стал часто замечать, такие вот определения полей струкутр:
 
Код:
typedef struct __anystruct
{
    //...
    char Buffer[1]; // Разноразмерный массив
}ANYSTRUCT, *LPANYSTRUCT;

В чем здесь прикол? Зачем так делать? Почему не написать char* Buffer? Да и в чем преимущество такого определения? Кроме того, тут получится, что под массив уже будет выделен 1 байт памяти.
489
22 августа 2008 года
NeO_u
277 / / 11.10.2006
Когда ты создаешь указатель, тебе надо обязательно конструкторе, или где-то еще его создавать через оператор new. И потом же его обязательно удалять оператором delete. И все эти операции происходят с памятью.
Когда же ты создаешь не указателем, ты создаешь массив в стеке и при уничтожении этого стека массив так же будет уничтожен. Что облегчает жизнь, и тебе не надо следить за тем, удалил ли ты этот массив.
3
22 августа 2008 года
Green
4.8K / / 20.01.2000
Цитата: Oxaid

В чем здесь прикол? Зачем так делать? Почему не написать char* Buffer? Да и в чем преимущество такого определения? Кроме того, тут получится, что под массив уже будет выделен 1 байт памяти.


Т.о. определяются структуры переменной длины.
Далее в коде, к примеру, можно написать:

 
Код:
LPANYSTRUCT p = (LPANYSTRUCT)new unsigned char(sizeof (ANYSTRUCT) + 8*sizeof(char));

и получить т.о. структуру с Buffer под 9 элементов.
Отличие от char* Buffer в том, что здесь вся структура располагается в памяти линейно.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог