Matriz de tamanho 0 no final da estrutura [duplicado]
Esta pergunta já tem uma resposta aqui:
Qual é a necessidade de um array com zero elementos? 5 respostasMeu professor de um curso de programação de sistemas que estou fazendo hoje nos disse para definir uma estrutura com uma matriz de comprimento zero no final:
struct array{
size_t size;
int data[0];
};
typedef struct array array;
Essa é uma estrutura útil para definir ou inicializar uma matriz com uma variável, ou seja, algo como a seguir:
array *array_new(size_t size){
array* a = malloc(sizeof(array) + size * sizeof(int));
if(a){
a->size = size;
}
return a;
}
Ou seja, usandomalloc()
, também alocamos memória para a matriz de tamanho zero. Isso é completamente novo para mim e parece estranho, porque, pelo que entendi, as estruturas não têm seus elementos necessariamente em locais contínuos.
Por que o código emarray_new
alocar memória paradata[0]
? Por que seria legal acessar, digamos
array * a = array_new(3);
a->data[1] = 12;
?
Pelo que ele nos disse, parece que é garantido que uma matriz definida como comprimento zero no final de uma estrutura venha imediatamente após o último elemento da estrutura, mas isso parece estranho, porque, novamente, pelo que entendi, as estruturas poderiam ter preenchimento.
Também vi que esse é apenas um recurso do gcc e não definido por nenhum padrão. Isso é verdade?