Объявление массива в C без указания размера - PullRequest
6 голосов
/ 22 июля 2010

При объявлении массива следующим образом:

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

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

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

Ответы [ 3 ]

23 голосов
/ 22 июля 2010

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

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

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

И т. д.

3 голосов
/ 22 июля 2010

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

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.

1 голос
/ 22 июля 2010

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

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

int array[][3] = {
    {1,2,3},
    {4,5,6}};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...