int **arr = (int *)malloc(r * r * sizeof(int));
Вы не можете создать двумерный массив с одним выделением, подобным этому, по крайней мере, ни один, к которому вы можете получить доступ с помощью int **
.Вместо этого у вас есть пространство для r * r
, объекты типа int
, к которым можно получить доступ через int *
и некоторую дополнительную арифметику.
Когда вы позже сделаете это:
*(*(arr + r) + r);
С первой разыменовкой все в порядке, поскольку arr
указывает на выделенный буфер.Второе, однако, нет, потому что вы читаете неинициализированное значение из этого выделенного буфера и пытаетесь использовать его в качестве действительного адреса.Это вызывает неопределенное поведение , которое в этом случае приводит к сбою.
Вам необходимо выделить место для массива int *
, они для каждого из них выделяют массив int
:
int **arr = malloc(r * sizeof(int *));
for (int i=0; i<r; i++) {
arr[i] = malloc(r * sizeof(int));
}