Похоже, у вас нет четкого представления о том, что именно вы хотите
достигать. Документируйте это! Это прояснит ваш разум, и, кроме того, если вы этого не поймете, никто больше этого не сделает,
и подобный код - кошмар, который нужно поддерживать (относится даже к вашему, когда время
проходит мимо).
Чтобы создать функцию, которая выделяет непрерывный блок памяти, вы должны вызывать SafeMalloc только один раз с общим объемом памяти, который будет использоваться.
/*
* Memory layout example for 2 rows and 3 cols
*
* 1 1 1 1 1 1 1 1 1 1
* 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
* |P|P|C|C|C|C|C|C|C|C|C|C|C|C|C|C|C|C|C|C|
* |1|2|1|1|1|2|2|2|3|3|3|1|1|1|2|2|2|3|3|3|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
*
* P1 is a pointer coloum data for row 1, points to memory start + offset 2 (assuming sizeof(int) == sizeof(int *))
* P2 is for row 2, points to memory start + offset 11
* C1 is coloumn 1 data, etc
*/
int **CreateInt2D(size_t rows, size_t cols)
{
int **memory_start, **p1, *col_data;
size_t total_memory_to_allocate;
total_memory_to_allocate = rows * sizeof(int *) + rows * cols * sizeof(int);
memory_start = (int **) SafeMalloc(total_memory_to_allocate);
for (col_data = (int *)(memory_start + rows), p1 = memory_start;
p1 < (int **)col_data;
++p1, col_data += cols * sizeof(int))
*p1 = col_data;
return memory_start;
}
Этот пример основан на том, чтобы максимально приблизиться к вашему оригиналу. Ответ Джона Кнеллера с использованием подписки на массив, вероятно, является лучшим способом сделать это.