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.