Имеет ли это смысл (Apple-документация)? - PullRequest
3 голосов
/ 15 марта 2010

Ниже приведен фрагмент официальной документации Apple AudioBufferList (Справочник по типам данных Core Audio) :

AudioBufferList
Содержит массив переменной длины структур AudioBuffer.

struct AudioBufferList {
    UInt32      mNumberBuffers;
    AudioBuffer mBuffers[1];
};
typedef struct AudioBufferList  AudioBufferList;

Поля

mNumberBuffers
Количество структур AudioBuffer в массиве mBuffers.

mBuffers
Массив переменной длины структур AudioBuffer.

Если mBuffers определяется как AudioBuffer[1], он не имеет переменной длины и, следовательно, mNumberBuffers неявно определяется как 1.

Я что-то здесь скучаю или это просто чепуха?

Ответы [ 4 ]

3 голосов
/ 15 марта 2010

Это то, что называется "взломом структуры" или (в C99) "массивом переменной длины" (VLA). Основная идея заключается в том, что «1» - это просто заполнитель. Когда вы используете эту структуру, вы выделяете ее динамически, выделяя достаточно места для реальных данных. Например, если вы хотите 10 буферов, вы должны выделить место примерно так:

AudioBufferList *a = malloc(sizeof (*a) + 9 * sizeof(AudioBuffer));
a->mNumberBuffers = 10;

Обратите внимание, что, поскольку он выделяет пространство для одного AudioBuffer как часть самой структуры, вы вычитаете один из числа, которое вы действительно хотите получить, чтобы получить пространство для добавления в распределение.

3 голосов
/ 15 марта 2010

Ну, это потому, что C до C99 требует ненулевого постоянного размера массива.

И mBuffers нельзя объявить как AudioBuffer*, так как список находится на месте.

И mBuffers нельзя объявить как AudioBuffer, поскольку необходим синтаксис mBuffers[x].

Так что AudioBuffer[1] используется.

Если эта структура написана только для C99, тогда объявление будет

struct AudioBufferList {
    UInt32      mNumberBuffers;
    AudioBuffer mBuffers[];
};

(См. Также Использование гибких элементов массива в C плохо? .)

2 голосов
/ 15 марта 2010

Из того, что мне сказали, бит mBuffers[1] - это просто старый трюк на Си. Что позволяет члену структуры быть массивом переменной длины. Знайте, что это должен быть последний элемент в структуре, так как вы напишите размер структуры.

Это должно быть правильно выделено. Или кучка щенков умрет и т.д ..

2 голосов
/ 15 марта 2010

Эту технику я тоже видел в PostgreSQL, хотя там она всегда помечена комментарием

// VARIABLE SIZED STRUCTURE

или что-то в этом роде. По сути, все работает так, что пользователи структуры должны понимать, что размер 1 mBuffers - это просто начальный размер. Чтобы изменить размер структуры, они realloc () целиком и просто предполагают, что любая память, прикрепленная к концу, «принадлежит» списку mBuffers, хотя само определение структуры не объясняет этого.

...