Нарушение прав доступа с++ при занулении элементов массива
Пишу программу по умножению матриц. При компиляции возникает ошибка "Необработанное исключение по адресу 0xC0000005: нарушение прав доступа при чтении по адресу 0xFFFFFFFFFFFFFFFFFFF." Отладчик показывает, что ошибка находится в строке, где я присваиваю 0 значение элементам массива С. Буду признателен за вашу помощь!
#include <iostream>
#include <cctype>
#include <conio.h>
#include <cstring>
using namespace std;
int main()
{
setlocale(LC_ALL , "Russian");
int K, L, M, N;
do {
system("cls");
cout << "Введите размерность первой матрицы" << endl;
cin >> K >> L;
cout << "Введите размерность второй матрицы" << endl;
cin >> M >> N;
if (L != M) {
system("cls");
cout << "IMPOSSIBLE";
_getch();
}
} while (L != M);
int **a = new int*[K];
for (int i(0); i < K; i++) {
a[i] = new int[L];
}
int **b = new int*[M];
for (int i(0); i < M; i++) {
b[i] = new int[N];
}
int **c = new int*[K];
for (int i(0); i < K; i++) {
b[i] = new int[N];
}
cout << "Введите значения первой матрицы" << endl;
for (int i(0); i < K; i++) {
for (int j(0); j < L; j++) {
cin >> a[i][j];
}
}
cout << "Введите значения второй матрицы" << endl;
for (int i(0); i < M; i++) {
for (int j(0); j < N; j++) {
cin >> b[i][j];
}
}
for (int i(0); i < K; i++) {
for (int j(0); j < N; j++) {
c[i][j]=0; //место ошибки
}
}
system("cls");
cout << "результат умножения" << endl;
for (int i(0); i < K; i++) {
for (int j(0); j < N; j++) {
for (int k(0); k < L; k++) {
c[i][j] += a[i][k] * b[k][j];
}
cout << c[i][j] << " ";
}
cout << endl;
}
for (int i(0); i < K; i++)
delete [] a[i];
delete [] a;
for (int i(0); i < M; i++)
delete [] b[i];
delete [] b;
for (int i(0); i < K; i++)
delete [] c[i];
delete [] c;
return 0;
}
Ответы (2 шт):
Автор решения: user494094
→ Ссылка
Не используйте копипаст, сделайте отдельную функцию. Лучше использовать std::vector. Ошибка тут:
int **b = new int*[M];
for (int i(0); i < M; i++) {
b[i] = new int[N];
}
int **c = new int*[K];
for (int i(0); i < K; i++) {
b[i] = new int[N]; // <- b вместо c
}
Автор решения: Harry
→ Ссылка
По-моему, типичная ошибка copy-paste:
int **b = new int*[M];
for (int i(0); i < M; i++) {
b[i] = new int[N];
}
Выше вы выделили память для массива b и его заполняете. А ниже - какой массив вы заполняете, выделив память для массива c? Не тот же b случайно?...
int **c = new int*[K];
for (int i(0); i < K; i++) {
b[i] = new int[N];
}