Почему я не могу опустить размеры вообще при инициализации многомерного массива?

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

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

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

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

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

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

Ответ 1

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

  • 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[][]; будет иметь неизвестное количество элементов неизвестного размера.

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

Ответ 2

Это приемлемая работа?

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

EDIT: обратите внимание, что в конце каждой строки будет добавлен дополнительный "\ 0".