Was ist die Ursache für ein flexibles Array-Element nicht am Ende des Strukturfehlers?

8

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?

    
csta 24.06.2012, 19:05
quelle

3 Antworten

14

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:

%Vor%

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).

    
Jerry Coffin 24.06.2012, 19:08
quelle
3
%Vor%

Sie können nicht haben flexibles Array-Element ( double data[] ) in der Mitte. Berücksichtigen Sie die Größe des fest codierten Arrays oder double *data

    
J-16 SDiZ 24.06.2012 19:09
quelle
2

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.

    
supercat 02.12.2013 19:23
quelle

Tags und Links