Membro de matriz flexível - Flexible array member

Os tipos de dados de struct C podem terminar com um membro de matriz flexível sem tamanho especificado:

struct vectord {
    short len;    // there must be at least one other data member
    double arr[]; // the flexible array member must be last
    // The compiler may reserve extra padding space here, like it can between struct members
};

Normalmente, essas estruturas servem como cabeçalho em uma alocação de memória variável maior :

struct vectord *vector = malloc(...);
vector->len = ...;
for (int i = 0; i < vector->len; i++)
     vector->arr[i] = ...;  // transparently uses the right type (double)

Efeito no tamanho da estrutura e preenchimento

O sizeof operador em tal struct fornece o tamanho da estrutura como se o membro flexível da matriz estivesse vazio. Isso pode incluir preenchimento adicionado para acomodar o membro flexível; o compilador também está livre para reutilizar esse preenchimento como parte do próprio array.

É comum alocar bytes. sizeof(struct) + array_len*sizeof(array element)

Isso não está errado, no entanto, pode alocar alguns bytes a mais do que o necessário: o compilador pode estar redefinindo alguns dos preenchimentos incluídos em sizeof(struct) . Se isso for uma preocupação, as macros estão disponíveis para calcular o tamanho mínimo, garantindo que o preenchimento do compilador não seja interrompido.

Como o array pode começar no preenchimento antes do final da estrutura, seu conteúdo deve sempre ser acessado via indexing ( arr[i] ) ou offsetof não sizeof .

Disponibilidade

Os membros da matriz flexível foram oficialmente padronizados em C99 . Na prática, os compiladores (por exemplo, GCC , Microsoft Visual C ) os forneciam muito antes de o C99 ser padronizado.

Membros de matriz flexível não fazem parte oficialmente do C ++ , mas as extensões de linguagem estão amplamente disponíveis.

Referências