Вы не можете инициализировать член гибкого массива.Согласно C 2018 6.7.2.1 18, в большинстве случаев, член гибкого массива игнорируется.Это одна из таких ситуаций: При инициализации это так, как если бы элемент не существовал.
Создание структуры с элементом гибкого массива в операторе объявления может создать только структуру с нулевыми элементами в массиве.Чтобы создать структуру с большим количеством членов в массиве, вы должны динамически распределять пространство с помощью malloc
или аналогичной процедуры.После того, как вы выделите достаточно места, вы можете преобразовать указатель в указатель в Category
и затем присвоить (а не инициализировать) значения его элементам, включая элементы его элемента гибкого массива.
(Возможно,мог бы быть ужасный способ определить объединение, содержащее структуру с элементом гибкого массива, таким образом, чтобы обеспечить достаточное пространство для элементов массива, заполнив объединение массивом char
необходимого размера.не удалось инициализировать эти элементы, но вы можете назначить их. Не делайте этого.)
Чтобы настроить прототип Category
объектов, вы можете использовать:
static const Category category1 = {"Academic Registrar"};
static const Category category2 = {"Financial Services"};
static const Category category3 = {"IT Support", "IT"};
static const Category category4 = {"Parking Police", "PP"};
static const Category category5 = {"Coop Placement", "CP"};
Позже,чтобы создать Category
с несколькими Ticket
элементами, вы можете сделать:
Category *C = malloc(sizeof *C + nTickets * sizeof(Ticket));
// Test C for NULL in case malloc failed.
// Copy initial data into new Category.
*C = category3;
// Assign values to Ticket elements.
for (int i = 0; i < nTickets; ++i)
{
C->ticket[i] = rand();
C->timestamp = 0;
}
Обратите внимание, что вы не можете создать массив объектов Category
, потому что они имеют гибкий размер и объекты в массивеможет иметь только фиксированный размер.Таким образом, вы можете работать только с одним Category
одновременно.Указатель C
выше может указывать только на один Category
, а не на их массив.Но элемент C->ticket
является массивом Ticket
.
Обратите внимание, что я не обязательно рекомендую копировать данные в Category
из прототипов таким образом.Если данные короткие, их можно просто назначить в коде.Если данные длинные, может быть лучше использовать указатели на данные, а не копировать все данные в каждый из них.Хорошие решения зависят от обстоятельств.Приведенный выше код приведен только в качестве примера.