Это то, что называется "взломом структуры" или (в C99) "массивом переменной длины" (VLA). Основная идея заключается в том, что «1» - это просто заполнитель. Когда вы используете эту структуру, вы выделяете ее динамически, выделяя достаточно места для реальных данных. Например, если вы хотите 10 буферов, вы должны выделить место примерно так:
AudioBufferList *a = malloc(sizeof (*a) + 9 * sizeof(AudioBuffer));
a->mNumberBuffers = 10;
Обратите внимание, что, поскольку он выделяет пространство для одного AudioBuffer как часть самой структуры, вы вычитаете один из числа, которое вы действительно хотите получить, чтобы получить пространство для добавления в распределение.