Оригинал доступен по ссылке hermetic.ch

Массив в C – это область памяти, где доступ к элементам (char, int и пр.) может быть осуществлен с помощью индекса (в одномерном массиве, к примеру, name[0]) или нескольких индексов (в многомерном массиве, например, names[3][0][2]). Первый элемент в одномерном массиве x[] – это x[0], в двухмерном массиве x[][] – это x[0][0] и т. д.

В C вы можете распределить память для массива, используя такие выражения, как:

char name[32];

int nums[100];

double coords[60][60]

char names[10][20][64];

double space[32][32][32][32];

Индекс последнего элемента в одномерном массиве будет на единицу меньше размера массива (к примеру, name[31], если объявленное имя массива – char name[32]). В многомерном массиве индексы последнего элемента на единицу меньше размера каждого измерения (например, names[9][19][63], если объявлено, что массив использует char name[10][20][64]).

Когда массив объявлен таким образом, как указано выше, то память для элементов массива выделяется при запуске программы, и эта память остается выделенной в течение всего времени выполнения программы. Это известно как статическое распределение массива.

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

Динамическое распределение одномерного массива легко выполнить с помощью функции malloc(). К примеру, если вы хотите выделить массив на 1000 элементов типа itn, то можно использовать следующий код:

#include <malloc.h>

#include <stdio.h>

#include <stdlib.h>

void main(void)

{

int *a;

int i=1000;

if ( ( a = (int *)malloc(i*sizeof(int)) ) == NULL )

    {

    printf(«\nError, memory not allocated.\n»);

    exit(1);

    }

for ( i=0; i<1000; i++ )

    a[i] = i;

//  …

free(a);

}

Динамическое распределение для массивов, количество измерений которых больше, чем 1, совершить не так просто, поскольку динамическое распределение n-мерного массива фактически требует динамического распределения для одномерных массивов в количестве n. Чтобы выделить двухмерный массив, для начала вы должны выделить память, достаточную для хранения всех элементов массива (данных), а затем выделить память для указателей на каждую строку массива. Для массивов, состоящих из более, чем двух измерений, это будет еще сложнее. Для того, чтобы выделить память для трехмерного массива, вы сначала выделяете память для данных, затем выделяете память для массива с указателями на строки данных в этой памяти, а затем выделяете память для массива с указателями на подмножество этих указателей. И так далее для массивов с еще большим количеством измерений.