2015-04-22 10 views
5

Załóżmy, że mam C struct zdefiniowane następująco:układ Pamięć C struct z tablicami

typedef struct 
{ 
    double array1[2]; 
} struct0_T; 

Jak pamięć rozplanowane? Czy struktura będzie zawierała tylko wskaźnik lub wartość dwóch dubletów? Zanim pomyślałem, że struct posiada wskaźnik, ale dzisiaj dowiedziałem się (ku mojemu zdziwieniu), że wartości są tam przechowywane. Czy różni się on między różnymi kompilatorami?

+3

Przechowuje wartości. I nie, nie różni się między kompilatorami. –

+1

Gdyby trzymał tylko wskaźnik, gdzie byłyby dane? –

+1

tablice nie są wskaźnikami. W niektórych sytuacjach tablice rozpadają się na wskaźnik. Z pewnością nie jest to jedna z tych sytuacji. – bolov

Odpowiedz

9

Struktura zawiera dwie wartości. Układ pamięci to .array1[0], a następnie .array1[1], po którym opcjonalnie następuje dopełnienie.

Wypełnienie jest jedyną częścią tego, która może się różnić między kompilatorami (chociaż w praktyce, z jedynym elementem struktury będącym tablicą prawie na pewno nie będzie padding).

Chociaż być może słyszałeś, że tablica w C jest wskaźnikiem, to nie jest prawdą - tablica jest typem złożonym, składającym się ze wszystkich obiektów członkowskich, podobnie jak struktura. Po prostu w prawie wszystkich kontekstach wyrażeń tablica ocenia wskaźnik do swojego pierwszego elementu.

+1

Tablice nie mogą zawierać bajtów dopełnienia. – edmz

2

Powyższa deklaracja struktury wystarczy poinformować kompilator, że zmienne tego typu struktury danych struct zajmą sizeof(struct0_T) bajtów pamięci i ta pamięć zostanie przydzielona, ​​gdy zmienna tego typu zostanie utworzona.

struct0_T s; 

Teraz s zawiera tablicę dwóch doubles. W tym przypadku nie będzie paddingu.