Я настоятельно не рекомендую вам использовать гибкий массив, потому что это не что иное, как кладжа. Вместо этого вы должны объявить и использовать его как struct Field *
, malloc
, увеличивая его размер, как любой другой динамический массив.
Тем не менее, malloc
с размером массива n_elem
:
struct Register register = malloc(sizeof(*register) + n_elem * sizeof(*register->FieldArray));
Для доступа к элементам:
char high = register->FieldArray[0].High;
Для инициализации: в gcc, по крайней мере, вы можете инициализировать часть массива статически, как и любой другой статический массив. Я не уверен, как другие компиляторы справляются с этим.
Почему гибкие массивы не рекомендуется:
Я сошлюсь на этот пост , но я не думаю, что ответ завершен (большая часть разочарования, потому что это только c-99), поэтому я добавлю свои мысли.
Они являются исключением. По сути, вы объявляете массив нулевым размером и каждый раз обращаетесь к нему за пределами, просто в той степени, на которую вы выделили. Вы не можете использовать структуру с гибким массивом, как любая другая структура, например вы не можете взять sizeof
гибкий массив. Если вы объявляете статический или массив из них, вы не можете использовать член массива, потому что для него нет выделенного пространства.
Пример использования их в массиве:
#include <stdio.h>
struct test {
int val;
int arr[];
};
int main() {
struct test tarr[2];
printf("%p\n%p\n", &tarr[0].arr[0], &tarr[1].val);
}
Выход:
0x7fff59b67164
0x7fff59b67164
Они по одному адресу. Если вы попытаетесь записать в элемент массива, вы перезапишете следующий объект. Если вы пытаетесь читать с него, вы читаете данные из следующего объекта. В зависимости от заполнения это может быть даже бессмысленное значение из заполнения.
Они похожи на goto
утверждения, оба потенциально полезны, но чаще всего плохая идея. Если вы не знаете, почему они опасны, вам не следует их использовать (в реальном коде; неплохо было бы поиграться с ними в тестовой программе, чтобы увидеть, как их правильно использовать и как они могут представить проблемы).