Структура с гибким элементом массива, по-видимому, не предназначена для объявления, а скорее используется вместе с указателем на эту структуру. При объявлении гибкого члена массива должен быть хотя бы один другой член, и этот гибкий член массива должен быть последним членом в этой структуре.
Допустим, у меня есть такой:
struct example{
int n;
int flm[];
}
Затем, чтобы использовать его, мне нужно будет объявить указатель и использовать malloc для резервирования памяти для содержимого структуры.
struct example *ptr = malloc(sizeof(struct example) + 5*sizeof(int));
То есть, если я хочу, чтобы мой массив flm [] содержал пять целых чисел. Затем я могу просто использовать свою структуру следующим образом:
ptr->flm[0] = 1;
У меня вопрос, а разве я не могу использовать вместо этого указатель? Он не только был бы совместим до C99, но я мог бы использовать его с указателем на эту структуру или без него. Учитывая, что мне уже нужно использовать malloc с flm, разве я не могу это сделать?
Рассмотрим это новое определение структуры примера;
struct example{
int n;
int *notflm;
}
struct example test = {4, malloc(sizeof(int) * 5)};
Я бы даже смог использовать замену так же, как гибкий член массива:
Это тоже сработает? (При условии, что приведенное выше определение примера с notflm)
struct example test;
test.n = 4;
notflm = malloc(sizeof(int) * 5);
struct
в качестве способа реализации гибких массивов не является частью стандарта C99 (и может иметь проблемы с переносимостью, в основном из-за скрытого заполнения для выравнивания массива / указателя). - person Ted Hopp   schedule 05.08.2013struct
как способа реализации гибких массивов действительно было бы глупо. (Однако использование указателя в качестве последнего элементаstruct
, указывающего на отдельно выделенную память, совершенно разумно и происходит постоянно. Это не то же самое, что гибкие массивы.) - person This isn't my real name   schedule 05.08.2013struct foo {int bar; int *ary;} *my; my=malloc(sizeof(struct foo)+10*sizeof(int)); my.ary=(int*)(my+1);
. Это, конечно, глубоко глупо. Другое дело - позволить последнему элементу структуры быть указателем на другое место, правильно инициализированным адресом правильно выделенного фрагмента памяти. Это не структура с гибким элементом массива, это просто другой метод со своим собственным набором проблем. - person This isn't my real name   schedule 05.08.2013