Как распределяется память для статического многомерного массива? - PullRequest
1 голос
/ 01 декабря 2009

All

Это меня давно беспокоило. В C \ C ++ (я полагаю, java и .NET) нам не нужно указывать индекс строки в многомерном массиве. Так, например, я могу объявить массив целых чисел следующим образом:

int Array [] [100];

Я думаю, что статические массивы в целом представлены как непрерывная память в стеке. Итак, если взять представление по столбцу, как компилятор узнает, сколько памяти выделено в приведенном выше случае, если ему не хватает одного из измерений?

Ответы [ 3 ]

2 голосов
/ 01 декабря 2009

На языке C ++ вы не можете просто сделать

int Array[][100]; /* ERROR: incomplete type */

потому что это будет определение объекта неполного типа, что явно недопустимо в C ++. Вы можете использовать это в неопределяемой декларации

extern int Array[][100];

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

В C ситуация не сильно отличается, за исключением того, что в C есть такие вещи, как предварительные определения , которые позволяют писать

int Array[][100];

Тем не менее, предварительное определение в этом отношении очень похоже на неопределенное объявление, поэтому оно разрешено. В конце концов вам придётся определить один и тот же объект с явно заданным размером в одной и той же единице перевода (некоторые компиляторы не требуют этого как нестандартное расширение). Если вы попробуете что-то подобное в не предварительном определении, вы получите ошибку

static int Array[][100]; /* ERROR: incomplete type */

Итак, если вы подумаете об этом, кроме предварительных определений, ситуация в C и C ++ не сильно отличается: недопустимо определять объекты неполного типа в этих языках, а массив неопределенного размера является неполным типом.

1 голос
/ 01 декабря 2009

Он не знает, сколько памяти выделить, он знает, с array[], что массив является указателем (как int *array). array[][100] (кто-то, пожалуйста, поправьте меня, если я ошибаюсь) - то же самое, что и array[100].

1 голос
/ 01 декабря 2009

В Java и .NET не думайте о «стеке» - объекты живут в куче. А в C это просто декларация - только определение фактически резервирует память! Так что это НЕ будет приемлемым определением - если вы поместите его в качестве единственной строки в файле a.c:

$ gcc -c a.c
a.c:1: warning: array ‘Array’ assumed to have one element

так что gcc просто обрабатывает его так, как если бы он был int Array[1][100];, и предупреждает вас, что он делает.

...