@sitrof

Сдвиг двумерного массива, появление ошибки Stack around the variable 'arr' was corrupted. Как исправить без переписывания кода?

Здравствуйте, появилась проблема, при которой код работает как надо, но выдает после выполнения ошибку о том, что компилятор пытается обратиться к -1 элементу массива. При изменении -1 на 0 в цикле, или >= 0, программа выполняется не так, как надо.
Коротко говоря, суть задачи в том, чтобы передвинуть двумерный массив на N позиций вправо.
Можно ли как-то исправить код без переписывания и использования других решений? Оставив цикл и swap. Заранее благодарю за решение

srand(time(NULL));

int arr[3][6], num{0};

    for (int i{ 0 }; i < 3; i++) {
        for (int j{ 0 }; j < 6; j++) {
            arr[i][j] = rand() % 20 + 1;
            cout << arr[i][j] << "\t";
        }
        cout << endl;
    }
    cout << "Введите на сколько позиций сдвинуть: ";
    cin >> num;

    for (int i{0}; i < num; i++) {
        int temp = arr[2][5];
        for (int i{ 2 }; i > -1; i--) {
            for (int j{ 5 }; j > -1; j--) {
                swap(arr[i][j], arr[i][j - 1]);
            }
            if (i == 0) {
                arr[0][0] = temp;
                break;
            }
        }
    }
    for (int i{ 0 }; i < 3; i++) {
        for (int j{ 0 }; j < 6; j++) {
            cout << arr[i][j] << "\t";
        }
        cout << endl;
    }
  • Вопрос задан
  • 62 просмотра
Пригласить эксперта
Ответы на вопрос 1
wataru
@wataru Куратор тега C++
Разработчик на С++, экс-олимпиадник.
Код исправляется элементарно. Надо внутренний цикл по j гнать не до 0, а до 1. Что бы не вылезать за границу массива, вы же там к j-1 -ому элементу обращаетесь. А поскольку вы делаете swap, то вы меняете элементы массива с памятью перед ним. Массив - локальная переменая, а значит он лежит на стеке и вот это вот затирание памяти рядом с массивом и есть это самое "Stack around the variable 'arr' was corrupted".

Ну и по стилю - вместо i > -1 обычно пишут i >= 0.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы