Ошибка чтения памяти при компиляции [дубликат]

185
08 января 2022, 06:30
На этот вопрос уже дан ответ здесь:
Ошибка доступа к элементам массива, строки, вектора (1 ответ)
Закрыт 1 месяц назад.

Код ошибки:

Exception thrown at 0x00007FF727DE25CF in ConsoleApplication.exe: 0xC0000005: Access violation reading location 0x000000C3639174A0. occurred

Код програмы:

#include<iostream>
#include <iomanip>
using namespace std;
const int n = 15, N = 2 + n, M = 5 + n;
int main()
{
    srand(time(NULL));
    setlocale(0, " ");
    double a[N][M],min,max;
    min = max = 0;
    for (int i = 0; i <=N; i++)
    {
        for (int j = 0; j <=M; j++)
        {
            a[i][j] = pow(n, i + j) + pow(n, i - j) - (i + j) * (i - j);
            cout << "a[" << i << "][" << j << "]=" <<  a[i][j] << endl;
            if (a[i][j] < min) min = a[i][j];
            if (a[i][j] < max) max = a[i][j];
        }
        cout << endl;
    }
    cout << "Минимальное число" << min << endl;
    cout << "Максимальное число" << max << endl;
    return 0;
}

Если память меня не подводит, у меня компилятор Visual Studio 2019.

Answer 1

Каждый из циклов в этом коде будет выполняться на один раз больше, чем необходимо.

Возьмём, к примеру, этот фрагмент для N = 2.

double a[N];
for (int i = 0; i <=N; i++) {
    a[i];
}

условие i <= N будет выполняться для значений 0, 1, 2. То есть для трёх значений. В то время, как размер массива - 2 и, соотевтственно, допустимые индексы для него 0, 1. Значит доступ к a[2] уже будет за пределы массива, что является неопределённым поведением согласно станрту С++. И это поведение проявляется как ошибка времени исполнения представленная здесь.

READ ALSO
Получение NULL при побитовой конъюнкции

Получение NULL при побитовой конъюнкции

В проекте есть следующий код:

92
C++ Применение cin.getline к двумерным массивам char

C++ Применение cin.getline к двумерным массивам char

Вопрос таков - какие есть решения?

144
Почему нет доступа к полям MyIterator?

Почему нет доступа к полям MyIterator?

Я пишу вторую версию вставки в map, где нужно передавать ещё и итератор, помимо вставляемой пары, то есть пишу аналог такой вставки:

195