Элемент массива Struct без определенной длины

Я столкнулся с этим fragmentом кода:

struct test { uint32 num_fields; char array_field []; }; 

Как я могу понять array_field ? Является ли это расширением gcc для языка C?

Это функция C99, называемая гибким элементом массива, который обычно используется для создания массива переменной длины.

Он может быть указан только как последний элемент структуры без указания размера (как в array_field []; ).


Например, вы можете сделать следующее, и для члена arr будет выделено 5 байт:

 struct flexi_example { int data; char arr[]; }; struct flexi_example *obj; obj = malloc(sizeof (struct flexi_example) + 5); 

Его плюсы и минусы обсуждались здесь:

Гибкие члены массива в C – плохо?

Такие структуры обычно выделяются в куче с расчетным размером с кодом, таким как:

 #include  struct test * test_new(uint32 num_fields) { size_t sizeBeforeArray = offsetof(struct test, array_field); size_t sizeOfArray = num_fields * sizeof(char); struct test * ret = malloc(sizeBeforeArray + sizeOfArray); if(NULL != ret) { ret->num_fields = num_fields; } return ret; }