Элемент массива Struct без определенной длины У меня есть такой код: struct test { uint32 num_fields; char array_field []; }; Как понять array_field? Является ли это расширением gcc для языка C? Ответ 1 Это функция C99, называемая гибким элементом массива, который обычно используется для создания массива переменной длины. Он может быть указан только как последний элемент структуры без указания размера (как в array_field [];). Например, вы можете сделать следующее, и для элемента arr будет выделено 5 байт: struct flexi_example { int data; char arr[]; }; struct flexi_example *obj; obj = malloc(sizeof (struct flexi_example) + 5); Обсуждаемые здесь плюсы/минусы: Гибкие члены массива в C - плохо? Ответ 2 Такие структуры обычно выделяются в куче с расчетным размером с кодом, например: #include <stddef.h> 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; }
Ответ 1 Это функция C99, называемая гибким элементом массива, который обычно используется для создания массива переменной длины. Он может быть указан только как последний элемент структуры без указания размера (как в array_field [];). Например, вы можете сделать следующее, и для элемента arr будет выделено 5 байт: struct flexi_example { int data; char arr[]; }; struct flexi_example *obj; obj = malloc(sizeof (struct flexi_example) + 5); Обсуждаемые здесь плюсы/минусы: Гибкие члены массива в C - плохо?
Ответ 2 Такие структуры обычно выделяются в куче с расчетным размером с кодом, например: #include <stddef.h> 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; }