Объявление массива в C без указания размера

При объявлении массива, подобного этому:

int array[][] = {
    {1,2,3},
    {4,5,6}};

Я получаю сообщение об ошибке: "Тип массива имеет неполный тип элемента"

Что происходит?

Ответ 1

С N-мерным массивом (N > 0) вам нужно определить размеры размеров N-1; компилятор может определить только одно измерение, и это должно быть первое измерение.

Вы можете написать:

int d1[] = { ... };
int d2[][2] = { ... };
int d3[][2][3] = { ... };

Etc.

Ответ 2

Вам нужно указать все размеры, кроме самого высокого. Причина в том, что компилятор собирается выделить один большой блок памяти, в отличие от одного массива указателей, указывающих на собственные маленькие массивы. Другими словами,

int array[][3][4] = ...;

выделит одну смежную область памяти размером 3 * 4 * (однако многие 3x4 массивы вы заявляете здесь). Таким образом, когда позже в вашем коде вы пишете

array[1][2][3] = 69;

чтобы найти, где в памяти записать 69, он начинается с адреса (массива), затем перескакивает вперед 12 * sizeof (int), чтобы получить массив [1], плюс 2 * 4 * sizeof (int), чтобы получить к массиву [1] [2], плюс 3 * sizeof (int), чтобы, наконец, добраться до начала массива [1] [2] [3]. Сравните это с написанием, например,

int ***array = new int**[n];
for(i=0; i<n; i++)
{
  array[i] = new int * [3];
  for(j=0; j<4; j++)
    array[i][j] = new int[4];
}

(извините, если мой синтаксис не является точным... было некоторое время, так как мне пришлось кодировать что-то вроде этого в C). В этом примере массив указывает на блок кода n * sizeof (int **) байтов в длину. Каждый элемент этого массива указывает на другой массив длиной 3 * sizeof (int *) байтов. Каждый элемент этих массивов указывает на другой массив размером 4 * sizeof (int) байтов. В этом случае вместо вычисления того, что массив [1] [2] [3] находится по адресу (массив + что-то), ему нужно будет следовать нескольким различным указателям в памяти, прежде чем найти, где писать 69.

Ответ 3

Вы должны сказать ему хотя бы все размеры, кроме самых больших.

т.е. в вашем случае

int array[][3] = {
    {1,2,3},
    {4,5,6}};