Определить максимум среди сумм элементов диагоналей, параллельных главной диагонали матрицы

Написал программу, но возникает проблема, когда количество столбцов становится больше чем строк на 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);
}

Ответы (0 шт):