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 respostas

Meu 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?

questionAnswers(5)

yourAnswerToTheQuestion