Неясная ошибка в программе сортировки массива c++

Необходимо было сделать программу по такому условию:

Дана матрица размера M x N. Упорядочить ее столбцы так, чтобы их последние элементы образовывали убывающую последовательность

Как я понял, нужно просто упорядочить по убыванию последнюю строку (то есть ту, которая под номером M). Почему-то программа умирает сразу после исполнения сотой строки кода:

завершил работу с кодом -1073741819.

При сборке программы в режиме отладки, microsoft visual studio говорит такое:

Вызвано исключение по адресу 0x00543471 в ConsoleApplication.exe: 0xC0000005: нарушение прав доступа при чтении по адресу 0xFDFDFE01.

Работаю в microsoft visual studio 2019. Прошу прощения за потенциально низкокачественный код.

#include <iostream>
#include <ctime>
#include <iomanip>
int** array_create(int m, int n);
void array_fill(int** array, int m, int n);
void array_output(int** array, int m, int n);
void array_sorting(int** array, int m, int n);
void main()
{
    setlocale(LC_ALL, "Russian");
    int n, m, i;
    std::cout << "Количество строк\tm = ";
    std::cin >> m;
    std::cout << "Количество столбцов\tn = ";
    std::cin >> n;
    int** a = array_create(m, n);
    array_fill(a, m, n);
    array_output(a, m, n);
    array_sorting(a, m, n);
    std::cout << "\n Новый массив: \n";
    array_output(a, m, n);
    std::cout << "\n";
    for (i = 0; i < n; ++i)
    {
        delete a[i];
    }
    delete[]a;
}
int** array_create(int m, int n)
{
    int** array = new int* [m];
    for (int i = 0; i < m; ++i)
    {
        array[i] = new int[n];
    }
    return array;
}
void array_fill(int** array, int m, int n)
{
    int i, j;
    int aco;
    srand((unsigned)time(NULL));
    do {
        std::cout << "\n Выбор способа введения массива: \n 1) Вручную; \t 2) Случнайным образом. \n Введите номер нужного способа: \n ";
        std::cin >> aco;
        if ((aco != 1) && (aco != 2))
        {
            std::cout << "\n Попытка неудачная, попробуйте ещё раз. \n ";
        }
    } while ((aco != 1) && (aco != 2));
    std::cout << "\n Начальный массив: \n";
    if (aco == 1)
    {
        for (i = 0; i < m; ++i)
        {
            for (j = 0; j < n; ++j)
            {
                std::cout << "a[" << i + 1 << "][" << j + 1 << "] = ";
                std::cin >> array[i][j];
            }
            std::cout << "\n";
        }
    }
    if (aco == 2)
    {
        for (i = 0; i < m; ++i)
        {
            for (j = 0; j < n; ++j)
            {
                array[i][j] = 1 + rand() % 99;
            }
        }
    }
}
void array_output(int** array, int m, int n)
{
    int i, j;
    for (i = 0; i < m; ++i)
    {
        for (j = 0; j < n; ++j)
        {
            std::cout << std::setw(4) /*<< " a[" << i + 1 << "][" << j + 1 << "]="*/ << array[i][j];
        }
        std::cout << "\n";
    }
}
void array_sorting(int** array, int m, int n)
{
    int i, j, b, c, d;
    b = 0;
    i = m;
    j = 0;
    d = 0;
    std::cout << "\n\n Попытки: \n";
    do
    {
        d = 0;
        for (j = 0; j < n; ++j)
        {
            b++;
            std::cout << "\n i = " << i << "; \t j = " << j << ";\n";
            std::cout << "\n1_до:   \ta[" << i << "][" << j << "]=" << array[i][j] << "\ta[" << i << "][" << j + 1 << "]=" << array[i][j + 1] << ";\n";

            if (j <= n - 2)
            {
                std::cout << "\n1_до:   \ta[" << i << "][" << j << "]=" << array[i][j] << "\ta[" << i << "][" << j + 1 << "]=" << array[i][j + 1] << ";\n";

                if (array[i][j] < array[i][j + 1])
                {
                    std::cout << "\n1_до:   \ta[" << i << "][" << j << "]=" << array[i][j] << "\ta[" << i << "][" << j + 1 << "]=" << array[i][j + 1] << ";\n";
                    std::swap(array[i][j], array[i][j + 1]);
                    std::cout << "1_после:\ta[" << i << "][" << j << "]=" << array[i][j] << "\ta[" << i << "][" << j + 1 << "]=" << array[i][j + 1] << ";\n";
                    ++d;
                }
            }
            if (j >= 1)
            {
                if (array[i][j - 1] < array[i][j])
                {
                    std::cout << "\n2_до:   \ta[" << i << "][" << j - 1 << "]=" << array[i][j - 1] << "\ta[" << i << "][" << j << "]=" << array[i][j] << ";\n";
                    std::swap(array[i][j - 1], array[i][j]);
                    std::cout << "2_после:\ta[" << i << "][" << j - 1 << "]=" << array[i][j - 1] << "\ta[" << i << "][" << j << "]=" << array[i][j] << ";\n";
                    ++d;
                }
            }
        }
        for (c = 0; c < b; ++c)
        {
            std::cout << "\b";
        }
        std::cout << b;
    } while (d > 0);
}

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