Вне зависимости от типа распределения массива N
х N
принимает одну из следующих форм:
Если N
известно во время компиляции, или если массивы переменной длины поддерживаются, это легко:
T (*arr)[N] = malloc(sizeof *arr * N);
Элементы доступны как arr[i][j]
. Когда вы закончите, вы бы освободить их
free(arr);
Если N
не известно во время компиляции и Власа не поддерживаются и все элементы массива должны быть смежными, то вам нужно выделить 1D массив и вычислить смещение:
T *arr = malloc(sizeof *arr * N * N);
...
x = arr[ i * N + j ];
Если элементы массива не должны быть смежными, вы можете сделать выделение кусочным:
T *arr = malloc(sizeof *arr * N);
if (arr)
{
for (size_t i = 0; i < N; i++)
{
arr[i] = malloc(sizeof *arr[i] * N);
}
}
Вы бы этот массив в качестве arr[i][j]
, но так как вы выделили его кусочно, вы должны освободить его таким же образом:
for (size_t i = 0; i < N; i++)
free(arr[i]);
free(arr);
Если вы хотите, чтобы инициализировать элементы массива для всех бит-0, использовать calloc
вместо из malloc
:
T (*arr)[N] = calloc(N, sizeof *arr);
Если вы хотите, чтобы инициализировать элементы массива на что-то другое, чем все-бит нуля, то, что зависит от того, что T
выглядит.Если T
, скажем, тип структуры, содержащей два целочисленных элементов, и вы используете C99 или более поздней версии компилятора, вы можете использовать соединение буквального в сочетании с memcpy
:
memcpy(arr[i], (struct foo []){ {1,2}, {3,4}, {5,6}, {7,8} ... });
Это хорошо. У вас возникли вопросы? –
спасибо за редактирование, пожалуйста, напишите anwser, если у вас есть – gen
подобное сообщение http://stackoverflow.com/questions/1970698/using-malloc-for-allocation-of-multi-dimensional-arrays-with-different-row -lengt –