Простое правило для каждого malloc
должно быть free
.Вы выделили блок памяти, на который указывает arr1
, поэтому вам следует освободить этот один блок памяти.
free(arr1);
Вы не можете освободить блок памяти по частям,Если вы хотите сделать это, вам нужно выделить каждую строку индивидуально, но использование одного куска памяти в качестве 2D-массива также подойдет.Выделение каждой строки лучше, если размер каждой строки неизвестен.Одно большое распределение лучше, если размер строки фиксирован.
Кроме того, arr1
должен быть одним указателем, а не двойным указателем.Предупреждения компилятора должны были предупредить вас об этом.
int *arr1 = malloc (rows * columns * sizeof(int));
A двойной указатель - указатель на указатель.Нет необходимости создавать двойной указатель, чтобы сделать вид, что указатель является 2D-матрицей.