Определить максимум среди сумм элементов диагоналей, параллельных главной диагонали матрицы
Написал программу, но возникает проблема, когда количество столбцов становится больше чем строк на 2 и более. Программа работает при значениях NxM: 4x4, 4x5, 10x4... Но при значениях 4x6, 4x7, 4x8 ошибка: Segmentation fault (core dumped). При статическом массиве она работает с любыми значениями NxM, но с динамическим появляется ошибка. Можете подсказать в чем проблема?
#include <stdio.h>
#include <stdlib.h>
void printf_array(int **a, int n, int m);
void task_2(int **a, int n, int m);
int main()
{
int m, n, i, j;
printf("Введите количество строк и столбцов массива: ");
scanf("%d %d", &n, &m);
while ((n <= 0) || (m <= 0)) {
printf("Количество строк и столбцов должно быть больше 0\n");
printf("Введите количество строк и столбцов массива: ");
scanf("%d%d", &n, &m);
}
printf("\n");
int** a = (int**)malloc(n * sizeof(int*) + n * m * sizeof(int)); // Выделение памяти под двумерный массив
int* start = (int*)((char*)a + (n) * sizeof(int*));
for (i = 0; i < n; i++)
a[i] = start + i * m;
for (i = 0; i < n; i++) // Ввод элементов массива
for (j = 0; j < m; j++) {
printf("Введите элемент с адресом A[%d][%d]: ", i + 1, j + 1);
scanf("%d", &a[i][j]);
}
printf_array(a, n, m);
task_2(a, n, m);
return 0;
}
void printf_array(int **a, int n, int m) { // функция распечатки массива
for (int i = 0; i < n; i++) {
if (i > 0)
printf("\n");
for (int j = 0; j < m; j++)
printf("%d ", a[i][j]);
}
printf("\n");
}
void task_2(int **a, int n, int m) {
int i,j,razmer;
int column = 1, count = 0, row = 1; // column - столбец, count - счетчик, row - ряд
if (n>m) { // Считает размер массива
razmer = (n*2 - 2) - (n-m);
}
else if (m>n) {
razmer = (m*2 - 2) - (m-n);
}
else {
razmer = (m*2 - 2);
}
printf("Количество диагоналей в матрице, который параллельны главной: %d\n", razmer);
int *sum = (int*)malloc(razmer * sizeof(int)); // Создание массива под хранение сумм диагоналей матрицы
for (i = 0; i < razmer; i++) // обнуляем созданный массив
sum[i] = 0;
while (count < razmer) { // идем от 0 до razmer - 1
if (m - count > 1) { // проверка, пока count не дошел до главной диагонали
for (i = 0, j = column; j < m; i++, j++) { // считает сумму всех диагоналей выше главной
sum[count] += a[i][j];
}
column++;
}
else {
for (i = row, j = 0; i < n; i++, j++) { // считает сумму всех диагоналей ниже главной
sum[count] += a[i][j];
}
row++;
}
count++;
}
int max = sum[0];
printf("\n");
for (int i = 0; i < razmer; i++) { // находит максимульную сумму
printf("%d ", sum[i]);
if (sum[i] > max)
max = sum[i];
}
printf("\nМаксимум среди сумм элементов диагоналей, параллельных главной диагонали матрицы: %d\n", max);
}