2016-05-11 10 views
6

My Struct wygląda następująco:błąd: elastyczny element tablicy nie na końcu struktury

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; 

Błąd im coraz to „błąd: elastyczny element tablicy nie na końcu struktury”. Jestem świadomy, że ten błąd można rozwiązać przez przeniesienie int lost_index[] na końcu struktury. Dlaczego elastyczny element tablicy musi znajdować się na końcu struktury? Co jest powodem?

Ponieważ jest to duplikat innego pytania, w rzeczywistości nie znalazłem odpowiedzi, które faktycznie potrzebowałem, odpowiedzi w podobnym pytaniu nie opisują powodu, który stoi za kompilatorem, aby rzucić błąd, o który pytałem.

Dzięki

+2

Możliwy duplikat [Jaki jest przyczyna elastycznego elementu tablicy nie na końcu błędu struktury?] (Http://stackoverflow.com/questions/11180378/what-is-the-cause-of-flexible-array- błąd-członka-na-końcu-struktury-błędu) – jboockmann

+0

@pytheos Niezupełnie. To pytanie prosi o _reason_ za sposobem, w jaki został zaprojektowany. :) –

+0

W tej odpowiedzi nie znalazłem wyjaśnienia, dlaczego spowodowało to, co sprawia, że ​​kompilatory rzucają ten błąd. –

Odpowiedz

6

przeciwieństwie zgłoszeń tablicy parametrów funkcyjnych Tablica uznane jako część struct lub union musi mieć określony rozmiar (z jednym wyjątkiem opisanym poniżej). Dlatego zadeklarowanie nieprawidłowego jest zadeklarowania.

Wyjątkiem od tej reguły jest tak zwany "elastyczny element tablicy", który jest tablicą zadeklarowaną bez rozmiaru na końcu struct. Musisz umieścić go na końcu struct, aby pamięć dla niego mogła zostać przydzielona wraz z samym struct. Jest to jedyny sposób, w jaki kompilator może poznać przesunięcia wszystkich elementów danych.

Jeśli kompilator miały umożliwić elastyczne tablice w środku struct, położenie członków zaczynając size, allowed_memory_key_size, i dalej, będzie zależna od ilości pamięci, które można przydzielić do lost_index[] tablicy. Co więcej, kompilator nie będzie w stanie podeprzeć struct w razie potrzeby, aby zapewnić właściwy dostęp do pamięci.

Powiązane problemy