2014-11-04 13 views
5

Początkowo próbowałem zainicjować budowę takiego:Dlaczego potrzebuję więcej nawiasów klamrowych podczas inicjowania tej struktury?

struct { 
    char age[2];  // Hold two 1-Byte ages 
} studage[] = { 
    {23, 56}, 
    {44, 26} 
}; 

Ale to daje mi kompilatora o brakujących szelki, więc użyłem więcej szelki sugerowane przez kompilator i skończyło się tak:

struct { 
    char age[2];  // Hold two 1-Byte ages 
} studage[] = { 
    {{23, 56}}, 
    {{44, 26}} 
}; 

Brak ostrzeżenia. Dlaczego potrzebuję dodatkowych szelek?

+5

nie jest zewnętrzną strukturą jeden na jeden i wewnętrzna na tablicy char, która jest w środku? – Wookie88

+0

To ostrzeżenie, a nie błąd. Kompilator niczego nie "żąda". –

+2

duplikat [Jakie znaczenie mają podwójne nawiasy klamrowe inicjujące strukturę C?] (Http://stackoverflow.com/questions/6251160/what-is-the-mating-of-double-curly-braces-initializing- ac-struct)? – nicael

Odpowiedz

10

Masz tablicę struktur, struktura ma jeden element, który jest tablicą.

struct { 
    char age[2];  // Hold two 1-Byte ages 
} studage[] = { 
      ^
     This is for the studage array 
    { { 23, 56}}, 
    ^^ 
    | this is for the age array 
    this is for the anonymous struct 

    {{44, 26}} 
}; 

Być może łatwiej jest sprawdzić, czy struktura miał inny użytkownik:

struct { 
     int id; 
     char age[2]; 
    } studage[] = { 
     {1, {23, 56}}, 
     ^^^
     id | | 
      age[0] | 
       age[1] 
    };