как это исправить ? Вызвано исключение по адресу 0x00536BC4 в lab 5.exe: 0xC0000005: нарушение прав доступа при записи по адресу 0xFDFDFDFD

#include <iostream>
using namespace std;
int main()
{
    setlocale(LC_ALL, "rus");
    int line, column;
    cout << "Введите длину масива :";
    cin >> line;
    cout << "Введите длину столбца :";
    cin >> column;
    int** arr = new int* [line];
    for (int i = 0; i < line; i++) {
        arr[i] = new int[column];
    }
    for (int i = 0; i < line; i++) {
        for (int j = 0; j < column; j++) {
            arr[i][j] = rand();
        }
    }
    int max = arr[0][0], save_line = 0, save_column = 0;
    for (int i = 0; i < line; i++) {
        for (int j = 0; j < column; j++) {
            if (max < arr[i][j]) {
                max = arr[i][j];
                save_line = i;
                save_column = j;
            }
        }
    }
    int** arr_2 = new int* [line - 1];
    for (int i = 0; i < line - 1; i++) {
        arr_2[i] = new int[column - 1];
    }
    int line_2 = 0, column_2 = 0;
    for (int i = 0; i < line; i++) {
        for (int j = 0; j < column; j++) {
            if (save_line != i || save_column != j) {
                arr_2[line_2][column_2] = arr[i][j]; // ошибка тут;
                column_2++;
                if (column_2 == column - 1) {
                    column_2 = 0;
                    line_2++;
                }
            }
        }
    }
    for (int i = 0; i < column; i++) {
        delete[] arr[i];
    }
    delete[] arr;
    for (int i = 0; i < line_2; i++) {
        for (int j = 0; j < column_2; j++) {
            cout << arr[i][j] << " ";
        }
        cout << endl;
    }
    for (int i = 0; i < column_2; i++) {
        delete[] arr_2[i];
    }
    delete[] arr_2;
    return 0;
}

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

Автор решения: Павел Ериков

В общем в коде у вас появляются 3 ошибки в процессе выполнения программы и все связаны с выходом за пределы.

  1. Код ниже уже исправлен и работает без ошибок.

    Его проблема в том, что в этом двойном цикле вы работаете с двумерным массивом arr_2, которые имеет размерность line - 1 на column - 1, а оба цикла у вас шли до line и column соответственно.

    for (int i = 0; i < line - 1; i++) {
        for (int j = 0; j < column - 1; j++) {
            if (save_line != i || save_column != j) {
                arr_2[line_2][column_2] = arr[i][j]; // ошибка тут;
                column_2++;
                if (column_2 == column - 1) {
                    column_2 = 0;
                    line_2++;
                }
            }
        }
    }
    
  2. Код ниже так же был исправлен, чтобы наглядно увидеть ошибку, сравните свой и мой код.

    В этом коде проблема в том, что при освобождении памяти, вы пытаетесь удалить column одномерных массивов, а у вас их line.

    for (int i = 0; i < line; i++) {
        delete[] arr[i];
    }
    
  3. И аналогично второй ошибке, вы так же пытаетесь удалить column_2 одномерных массивов, а нужно line_2.

    for (int i = 0; i < line_2; i++) {
        delete[] arr_2[i];
    }
    

Так же у вас есть логические ошибки.

  1. Вы удаляете матрицу arr, а после пытаетесь её вывести.

  2. Я более чем уверен, что логических ошибок больше т.к. я так и не понял, что ваш код делает, да и разбираться лень) тем более это уже совсем другой вопрос.

→ Ссылка