Элемент массива 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;
}