2011-09-15 10 views
9

W programie Visual Studio 2010, to inicjalizacji działa zgodnie z oczekiwaniami:Dlaczego nie mogę całkowicie pominąć wymiarów podczas inicjowania wielowymiarowej tablicy?

char table[2][2] = { 
         {'a', 'b'}, 
         {'c', 'd'} 
        }; 

Ale nie wydaje prawny napisać coś takiego:

char table[][] = { 
        {'a', 'b'}, 
        {'c', 'd'} 
       }; 

Visual Studio narzeka, że ​​ta tablica nie może zawierać elementów ' ten typ i po kompilacji VS zgłasza dwa błędy: brakujący indeks i zbyt wiele inicjalizacji.

PYTANIE: Dlaczego nie mogę całkowicie pominąć wymiarów podczas inicjalizacji tablicy wielowymiarowej?

Odpowiedz

12

Tylko najbardziej wewnętrzny wymiar można pominąć. Rozmiar elementów w tablicy jest wyprowadzany dla typu podanego zmiennej tablicowej. Typ elementów musi zatem mieć znany rozmiar.

  • char a[]; posiada elementy (np a[0]) wielkości 1 (8-bitowego) i ma nieznaną wielkość.
  • char a[6]; ma elementy o wielkości 1, oraz ma rozmiar 6.
  • char a[][6]; posiada elementy (np a[0], która jest tablicą) wielkości 6 i ma nieznaną wielkość.
  • char a[10][6]; posiada elementy o rozmiarze 6. i ma rozmiar 60.

Niedozwolone: ​​

  • char a[10][]; miałby 10 elementów o nieznanej wielkości.
  • char a[][]; miałby nieznaną liczbę elementów o nieznanym rozmiarze.

Rozmiar elementów jest obowiązkowy, kompilator potrzebuje go do uzyskania dostępu do elementów (poprzez arytmetykę wskaźnika).

+6

Innymi słowy, chociaż rozmiar samej tablicy może być nieznany, rozmiar elementów nie może być nieznany? –

+0

@Miroslav: Dokładnie! –

+0

Ah, cóż, dzięki za tę odrobinę informacji. Po dalszych myślach wydaje się to logiczne, jak zawsze, prawda? ;-) –

0

Czy jest to dopuszczalne rozwiązanie?

char * table [] = { "ab", "cd" }; 

EDYCJA: Zwróć uwagę, że doda on dodatkowy "\ 0" na końcu każdego ciągu.

+0

To dobre rozwiązanie. Ale nie odpowiedź, której szukałem. Mimo to dziękuję za pokazanie mi fajnej sztuczki. :-) –

Powiązane problemy