Der Compiler kann nicht berechnen, wie viel Speicher belegt struct s b[];
wird. Dies bedeutet, dass der Compiler nicht herausfinden kann, wo sich diese Felder befinden, wenn die Struktur Felder enthält.
Früher war es (in alten Versionen von C) so, dass (z. B.) struct s b[];
als Mitglied einer Struktur nicht erlaubt war. Dies machte eine effiziente Speicherverwaltung ärgerlich. Stellen Sie sich als einfaches Beispiel vor, Sie haben eine Struktur, die eine "Name" -String enthält (dies können nur wenige oder viele Zeichen sein). Sie können ein Array mit fester Größe verwenden, das groß genug für den größten Namen ist (was Speicherplatz verschwendet), oder einen Zeiger verwenden und zwei Speicherelemente zuweisen (eines für die Struktur und eines für die Namenszeichenfolge mit variabler Länge). Alternativ können Sie einen Zeiger verwenden und ihn auf zusätzlichen Platz hinter dem Ende der Struktur verweisen lassen, was ungefähr so aussieht:
length = strlen(my_string);
foo = malloc(sizeof(MYSTRUCTURE) + length + 1);
foo->name = (void *)foo + sizeof(MYSTRUCTURE);
memcpy(foo->name, my_string, length + 1);
Dies war die effizienteste Option; aber es ist auch hässlich und fehleranfällig.
Um dies zu umgehen, haben Compiler nicht standardmäßige Erweiterungen hinzugefügt, um Arrays mit "unbekannter Größe" am Ende der Struktur zuzulassen. Dies machte es für Programmierer etwas einfacher und effizienter (da kein zusätzliches Zeigerelement erforderlich ist). Dies wurde schließlich vom C-Standard übernommen (vielleicht in C99 - ich erinnere mich nicht).