C ++ не поддерживает элементы гибкого массива C99 в конце структур, используя либо пустую индексную нотацию, либо индексную нотацию 0
(за исключением расширений, специфичных для поставщика):
struct blah
{
int count;
int foo[]; // not valid C++
};
struct blah
{
int count;
int foo[0]; // also not valid C++
};
Насколько я знаю, C ++ 0x также не добавит это.
Однако, если вы увеличите размер массива до 1 элемента:
struct blah
{
int count;
int foo[1];
};
вещи действительны и работают довольно хорошо. Вы можете выделить соответствующую память с помощью выражения, которое вряд ли будет содержать ошибки «один на один»:
struct blah* p = (struct blah*) malloc( offsetof(struct blah, foo[desired_number_of_elements]);
if (p) {
p->count = desired_number_of_elements;
// initialize your p->foo[] array however appropriate - it has `count`
// elements (indexable from 0 to count-1)
}
Так что он переносим между C90, C99 и C ++ и работает так же, как и члены гибкого массива C99.
Раймонд Чен сделал хорошую запись по этому поводу: Почему некоторые структуры заканчиваются массивом размера 1?
Примечание. В статье Рэймонда Чена приведена опечатка / ошибка в примере, инициализирующем «гибкий» массив. Следует читать:
for (DWORD Index = 0; Index < NumberOfGroups; Index++) { // note: used '<' , not '='
TokenGroups->Groups[Index] = ...;
}