Подтвердить что ты не робот

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

У меня есть такой код:

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

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

4b9b3361

Ответ 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;
}