Ich frage mich, warum ich immer error: flexible array member not at end of struct
error bekomme, wenn ich malloc anrufe. Ich habe eine Struktur mit einem Array variabler Länge, und ich bekomme diesen Fehler immer wieder.
Die Struktur ist
%Vor%und der Aufruf von malloc ist,
%Vor%Ist dies der richtige Aufruf an malloc?
Sie können nur ein flexibles Array-Element in einer Struktur haben, und es muss immer das letzte Mitglied der Struktur sein. Mit anderen Worten, in diesem Fall haben Sie einen Fehler gemacht, bevor Sie malloc
aufrufen, bis zu dem Punkt, dass es wirklich keine Möglichkeit gibt, malloc
für diese Struktur korrekt aufzurufen.
Um das zu tun, was Sie zu haben scheinen (Arrays mit der gleichen Anzahl von data
und label
-Mitgliedern), könnten Sie folgendes in Erwägung ziehen:
Beachten Sie, dass dies jedoch etwas anders ist: Anstelle eines Arrays von double
s, gefolgt von einem Array von int
s, erhalten Sie ein Array von einem double
, gefolgt von einem int
und dem nächsten double
, nächstes int
und so weiter. Ob dies nahe genug ist oder nicht, hängt davon ab, wie Sie die Daten verwenden (z. B. für die Übergabe an eine externe Funktion, die ein zusammenhängendes Array erwartet, müssen Sie wahrscheinlich die Dinge anders machen).
Wenn eine Strukturdefinition und ein Zeiger auf den Anfang einer Struktur gegeben ist, ist es notwendig, dass der C-Compiler auf jedes Mitglied der Struktur zugreifen kann, ohne auf etwas anderes zugreifen zu müssen. Da die Position jedes Elements innerhalb der Struktur durch die Anzahl und Typen der Elemente bestimmt wird, die ihm vorausgehen, erfordert der Zugriff auf ein Element, dass die Anzahl und Typen aller vorhergehenden Elemente bekannt sind. In dem speziellen Fall, in dem das letzte Element ein Array ist, stellt dies keine besondere Schwierigkeit dar, da der Zugriff auf ein Element in einem Array erfordert, wo es beginnt (wobei die Anzahl und der Typ von vorhergehenden -Elementen bekannt sein müssen) die Anzahl der Elemente im Array selbst) und der Item-Index (von dem der Compiler annehmen kann, dass er kleiner ist als die Anzahl der Items, für die der Space existiert, ohne etwas über die Array-Größe wissen zu müssen). Wenn ein flexibles Array-Member an einer anderen Stelle als am Ende einer Struktur auftaucht, hängt die Position der darauf folgenden Elemente von der Anzahl der Elemente im Array ab - etwas, das der Compiler nicht wissen wird.