Array der Größe 0 am Ende von struct [duplicate]

Diese Frage hat hier bereits eine Antwort:

Was braucht ein Array mit null Elementen? 5 Antworten

ein Professor eines Kurses zur Systemprogrammierung, den ich besuche, hat uns heute gebeten, eine Struktur mit einem Array der Länge Null am Ende zu definieren:

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

typedef struct array array;

Dies ist eine nützliche Struktur zum Definieren oder Initialisieren eines Arrays mit einer Variablen, d. H. Wie folgt:

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

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

    return a;
}

Das heißt, mitmalloc(), wir reservieren auch Speicher für das Array der Größe Null. Das ist für mich völlig neu und es scheint seltsam, weil Strukturen nach meinem Verständnis ihre Elemente nicht notwendigerweise an zusammenhängenden Stellen haben.

Warum macht der Code inarray_new reserviere Speicher fürdata[0]? Warum wäre es dann legal, auf @ zuzugreife

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

?

Von dem, was er uns erzählt hat, scheint es, dass ein Array, das als Länge Null am Ende einer Struktur definiert ist, unmittelbar nach dem letzten Element der Struktur kommt, aber dies scheint seltsam, da nach meinem Verständnis Strukturen dies könnten habe Polsterung.

Ich habe auch gesehen, dass dies nur eine Funktion von gcc ist und von keinem Standard definiert wird. Ist das wahr

Antworten auf die Frage(10)

Ihre Antwort auf die Frage