int **matrix = (int**)malloc(matrix_size * sizeof(int));
Должно стать
int **matrix = (int**)malloc(matrix_size * sizeof(int *));
потому что ты выделяешь массив указателей, а не массив целых чисел, а sizeof(int) вполне может быть не равно sizeof(int *).
for (int i = 0; i < matrix_size; ++i)
{
for (int j = 0; j < matrix_size; ++j)
{
if(i > j)
{
arr[i] = matrix[i][j];
}
}
}
Должно стать
counter = 0;
for (int i = 0; i < matrix_size; ++i)
{
for (int j = 0; j < matrix_size; ++j)
{
if(i > j)
{
arr[counter++] = matrix[i][j];
}
}
}
потому что иначе все элементы находящиеся в одной строке matrix ты складываешь в один и тот же элемент массива arr.