Почему я не могу полностью опустить измерения при инициализации многомерного массива? - PullRequest
9 голосов
/ 15 сентября 2011

В Visual Studio 2010 эта инициализация работает должным образом:

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

Но не кажется законным писать что-то вроде:

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

Visual Studio жалуется, что этот массив может не содержать элементы этого типа, и после компиляции VS сообщает о двух ошибках: отсутствующий индекс и слишком много инициализаций.

ВОПРОС : Почему я не могу вообще пропустить измерения при инициализации многомерного массива?

Ответы [ 2 ]

13 голосов
/ 15 сентября 2011

Только самое внутреннее измерение может быть опущено. Размер элементов в массиве определяется для типа, заданного переменной массива. Поэтому тип элементов должен иметь известный размер.

  • char a[]; имеет элементы (например, a[0]) размера 1 (8 бит) и имеет неизвестный размер.
  • char a[6]; имеет элементы размера 1 и имеет размер 6.
  • char a[][6]; имеет элементы (например, a[0], который является массивом) размера 6 и имеет неизвестный размер.
  • char a[10][6]; имеет элементы размера 6. и имеет размер 60.

Не допускается:

  • char a[10][]; будет иметь 10 элементов неизвестного размера .
  • char a[][]; будет иметь неизвестное количество элементов неизвестного размера .

Размер элементов является обязательным, он необходим компилятору для доступа к элементам (через арифметику указателей).

0 голосов
/ 15 сентября 2011

Это приемлемый обходной путь?

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

РЕДАКТИРОВАТЬ: Обратите внимание, что это добавит дополнительный '\ 0' в конце каждой строки.

...