Да это - Щелканье.
Для создания массива любой длины:
struct someData* mallocSomeData(int size)
{
struct someData* result = (struct someData*)malloc(sizeof(struct someData) + size * sizeof(BYTE));
if (result)
{ result->nData = size;
}
return result;
}
Теперь у Вас есть объект someData с массивом указанной длины.
Существуют, к сожалению, несколько причин, почему Вы объявили бы нулевой массив длины в конце структуры. Это по существу дает Вам способность возвратить структуру переменной длины из API.
Raymond Chen сделал превосходное сообщение в блоге на предмете. Я предлагаю, чтобы Вы смотрели на это сообщение, потому что оно, вероятно, содержит ответ, который Вы хотите.
Примечание в его сообщении, это имеет дело с массивами размера 1 вместо 0. <забастовка> Дело обстоит так, потому что нулевые массивы длины являются более свежей записью в стандарты. Его сообщение должен все еще относиться к Вашей проблеме.
http://blogs.msdn.com/oldnewthing/archive/2004/08/26/220873.aspx
РЕДАКТИРОВАНИЕ
Примечание: Даже при том, что в сообщении Raymond говорится, что 0 массивов длины законны в C99, они все еще не на самом деле законны в C99. Вместо 0 массивов длины здесь необходимо использовать длину 1 массив
Это - старый взлом C для разрешения гибких размерных массивов.
В стандарте C99 это не необходимо, поскольку он поддерживает прибытие [] синтаксис.