Добавление строки в двумерый динамический массив, не используя дополнительный массивов. C++

Даны N - количество строк матрицы, M - количество столбцов матрицы и сама матрица целых чисел. Добавить строку со всеми 0 после строки с максимальным элементом (массив динамический, дополнительных массивов не использовать). Написал код, но он не работает корректно. Какие ошибки в моём коде?

#include <iostream>
#include <stdlib.h>
#include <iomanip>
using namespace std;


// инициализация массива
int** init(int n, int m)
{
    int i;
    int** matr;
    matr= (int**)malloc(n*sizeof(int*));
    for (i = 0; i < n; i++)
        *(matr+i) = (int*)malloc(m * sizeof(int));
    return matr;
}
// заполнение массива 
void input(int** matr, int n, int m)
{
    for (int i = 0; i < n; i++)
        for (int j = 0; j < m; j++)
            cin >> matr[i][j];
}
//вывод массива
void output(int** matr, int n, int m)
{
    for (int i = 0; i < n; i++)
        for (int j = 0; i < m; j++)
        {
            cout << setw(4) << matr[i][j];
            cout << endl;
        }
}
//определение индекса строки с максимальным элементом
int index(int** matr, int n, int m)
{
    int max = matr[0][0];
    int ind = 0;
    for (int i = 0; i < n; i++)
        for (int j = 0; j < m; j++)
        {
            if (matr[i][j] > max)
            {
                max = matr[i][j];
                ind = i;
            }
        }
    return ind;
}
//увеличение размера матрицы и заполнение нужной строки нулями
int** add_line(int** matr, int* n, int m, int ind)
{
    (*n)++;
    matr = (int**)realloc(matr, (*n) * sizeof(int*));
    for (int j=(*n)-1;j<*n;j++)
    matr[j] = (int*)calloc(m, sizeof(int));
    for (int i = (*n) - 1; i > ind; i--)
        for (int j = 0; j < m; j++)
            matr[i][j] = matr[i - 1][j];
    for (int i = ind + 1; i < ind + 2; i++)
        for (int j = 0; j < *n; j++)
            matr[i][j] = 0;
    return matr;
}
int main()
{
    int** matr, M, N;
    cin >> N;
    cout << endl;
    cin >> M;
    cout << endl;
    matr = init(N, M);
    input(matr, N, M);
    int ind = index(matr, N, M);
    matr = add_line(matr, &N, M, ind);
    output(matr, N, M);
    return 0;
}

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

Автор решения: MBo

После realloc у вас остается n-1 действительных указателей на имеющиеся строки. Выделить память нужно только под одну - последнюю - строку.

И нулями заполнять одну строку нужно правильной длины

int** add_line(int** matr, int* n, int m, int ind)
{
    (*n)++;
    matr = (int**)realloc(matr, (*n) * sizeof(int*));

    matr[(*n) - 1] = (int*)malloc(m * sizeof(int));

    for (int i = (*n) - 1; i > ind; i--)
        for (int j = 0; j < m; j++)
            matr[i][j] = matr[i - 1][j];

    for (int j = 0; j < m; j++)
        matr[ind+1][j] = 0;

    return matr;
}

Ещё:

void output(int** matr, int n, int m)
{
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++)
        {
            cout << setw(4) << matr[i][j];
        }
        cout << endl;
    }
}

1   2   3
7   8   9
4   5   6

1   2   3
7   8   9
0   0   0
4   5   6
→ Ссылка