Меня действительно раздражает такой способ выделения двумерных матриц, поэтому я написал простую процедуру C для выделения и инициализации двумерного массива одним вызовом malloc (), чтобы вы могли освободить память с помощью одного свободного () вызов. (Обратите внимание, что это может быть расширено / изменено для использования нового символа [...])
/* set up the memory for a 2D matrix with entries of size "size" */
void** matrix2D(long rows, long columns, long size)
{
long i;
unsigned long long row_size = (unsigned long long)columns * (unsigned long long)size;
unsigned long long data_size = ((unsigned long long)rows * (unsigned long long)columns + 1) * (unsigned long long)size;
unsigned long long pointer_size = (unsigned long long)rows * sizeof(void*);
void** result;
if ( (result = (void**)malloc((size_t)(data_size + pointer_size))) == NULL ) {
return NULL;
}
// take the first bit for a vector pointing to the m_pData for each row
char* pdata = (char*)result + pointer_size;
if ((unsigned long)pdata % size) {
pdata += size - (unsigned long)pdata % size;
}
// for each row, set up the pointer to its m_pData
for (i = 0; i < rows; i++) {
result[i] = (void*)pdata;
pdata += row_size;
}
return result;
}
Тогда вы можете создать каждую из ваших матриц, используя одну строку, например ::
double** I = (double**)matrix2D(size, size, sizeof(double));
и они могут быть освобождены с помощью, например ,::1007*
free(I);
Гораздо проще. Кроме того, тогда значения данных матрицы являются смежными, поэтому, например, если вы создаете массив целых чисел и хотите инициализировать их все в ноль, вы можете сделать:
int** array = (int**)matrix2D(height, width, sizeof(int));
memset(array, 0, height * width * sizeof(int));
или, чтобы инициализировать его заданным (ненулевым) значением:
for (int i = 0; i < height * width; ++i)
array[i] = value;