2016-05-11 12 views
6

My Struct sieht wie folgt aus:Fehler: flexibel Arraymitglied nicht am Ende der Struktur

typedef struct storage { 
    char ***data; 

    int lost_index[]; 
    int lost_index_size; 

    int size; 
    int allowed_memory_key_size; 
    int allowed_memory_value_size; 
    int memory_size; 
    int allowed_memory_size; 

} STORAGE; 

Die im Fehler bekommen ist „Fehler: flexibel Arraymitglied nicht am Ende der Struktur“. Ich bin mir bewusst, dass dieser Fehler durch Verschieben von int lost_index[] am Ende von struct gelöst werden kann. Warum sollte ein flexibles Array-Element am Ende von struct sein? Was ist der Grund?

Da dies Duplikat einer anderen Frage angenommen, tatsächlich ich nicht gefunden habe Antworten, die ich wirklich gebraucht, Antworten auf ähnliche Frage nicht den Grund die Compiler steht hinter beschreiben Fehler zu werfen ich gefragt.

Dank

+2

Mögliche Duplikate von [Was ist die Ursache für flexible Array-Member nicht am Ende der Strukturfehler?] (Http://stackoverflow.com/questions/11180378/what-is-the-cause-of-flexible-array- member-not-at-end-of-struct-Fehler) – jboockmann

+0

@pytheos Nicht wirklich. Diese Frage fragt nach der Ursache hinter der Art, wie sie entworfen wurde. :) –

+0

In dieser Antwort habe ich keine Erklärung gefunden, warum es verursacht, was Compiler macht, um diesen Fehler zu werfen. –

Antwort

6

Im Gegensatz Array Deklarationen in Funktionsparametern, erklärt Array als Teil eines struct oder ein union eine Größe festgelegt haben muß (mit einer Ausnahme weiter unten beschrieben). Deshalb ist die Deklaration

int lost_index[]; 
int lost_index_size; 

falsch.

Die Ausnahme von dieser Regel ist ein sogenanntes "flexibles Array-Element", bei dem es sich um ein Array handelt, das am Ende der struct ohne Größe deklariert ist. Sie müssen es am Ende der struct platzieren, so dass der Speicher dafür mit der struct selbst zugeordnet werden konnte. Nur so kann der Compiler die Offsets aller Datenelemente kennen.

Wenn der Compiler in der Mitte eines Arrays flexible struct zu ermöglichen waren, die Lage der Mitglieder mit size beginnend, allowed_memory_key_size, und würde auf die Menge an Speicher abhängig sein, den Sie lost_index[] Array zuzuordnen. Darüber hinaus wäre der Compiler nicht in der Lage, die struct wo erforderlich zu füllen, um einen ordnungsgemäßen Speicherzugriff zu gewährleisten.