Matriz de tamaño 0 al final de la estructura [duplicado]

Esta pregunta ya tiene una respuesta aquí:

¿Cuál es la necesidad de una matriz con cero elementos? 5 respuestas

Mi profesor de un curso de programación de sistemas que estoy tomando nos dijo hoy que definamos una estructura con una matriz de longitud cero al final:

struct array{
    size_t size;
    int data[0];
};

typedef struct array array;

Esta es una estructura útil para definir o inicializar una matriz con una variable, es decir, algo de la siguiente manera:

array *array_new(size_t size){
    array* a = malloc(sizeof(array) + size * sizeof(int));

    if(a){
        a->size = size;
    }

    return a;
}

Es decir, usandomalloc(), también asignamos memoria para la matriz de tamaño cero. Esto es completamente nuevo para mí, y parece extraño, porque, según tengo entendido, las estructuras no tienen sus elementos necesariamente en ubicaciones continuas.

¿Por qué el código enarray_new asignar memoria adata[0]? ¿Por qué sería legal acceder entonces, digamos

array * a = array_new(3);
a->data[1] = 12;

?

Por lo que nos dijo, parece que una matriz definida como longitud cero al final de una estructura está garantizada para venir inmediatamente después del último elemento de la estructura, pero esto parece extraño, porque, de nuevo, según tengo entendido, las estructuras podrían tener relleno.

También he visto que esto es solo una característica de gcc y no está definido por ningún estándar. ¿Es esto cierto?

Respuestas a la pregunta(5)

Su respuesta a la pregunta