Q:

Нарушение прав доступа при чтении по адресу

Ошибка в коде на 29 строке: 

Нарушение прав доступа при чтении по адресу ...

#include<iostream>

using namespace std;

void print(double **matr, int size)
{
    cout << endl << endl;
    for (int i = 0;i < size;i++) {
        for (int j = 0; j < size; j++) {
            cout << matr[i][j] << " | ";
        }
        cout << endl;
    }
}

double Determinant(double **a,int size)
{
    double det = 0;
    if (size == 1) {
        det = a[0][0];
    }
    if (size == 2) {
        det = a[0][0] * a[1][1] - a[0][1] * a[1][0];
    }
    if (size > 2) {
        double **c = new double*[size];
        for (int k = size - 1;k <= size;k++) {
            for (int i = k + 1;i <= size;i++) {
                c[i][k] = a[i][k] / a[k][k];
                for (int j = k + 1;j <= size;j++) {
                    a[i][j] = a[i][j] - (c[i][k] * a[k][j]);
                }
            }
        }
    }
    for (int i = 0;i < size;i++)
        det *= a[i][i];
    return det;
}

int main()
{
    setlocale(LC_ALL, "Russian");
    int size;
    cout << "Введите количество неизвестных: ";
    cin >> size;
    double **Matx = new double *[size];
    for (int i = 0;i < size;i++) {
        Matx[i] = new double[size];
    }

    for (int i = 0;i < size;i++) {
        for (int j = 0;j < size;j++) {
            cin >> Matx[i][j];
        }
    }

    print(Matx, size);

    cout << "Детерминант: " << Determinant(Matx, size) << endl;

    //Удаление
    for (int i = 0; i < size; i++)
    {
        delete[] Matx[i]; // Удаляем каждый элемент
    }
    delete[] Matx;

    system("pause");
    return 0;
}

В чем причина ошибки?

A:

Память под строки матрицы c в функции Determinant нигде не выделяется. Делаетеся только выделение массива указателей
double **c = new double*[size];

а память под собственно элементы матрицы не выделена. Понятно, что любая попытка доступа к c[i][j] будет вызывать падение.
В функции Determinant внешний цикл в паре
for (int k = size - 1;k <= size;k++) {
  for (int i = k + 1;i <= size;i++) {

выполнит только две итерации (для k == size - 1 и k == size), а внутренний - только одну итерацию (для i == size). Так и задумано?
При этом доступ по индексам size - это доступ за пределами используемых массивов.
Отдельно стоить заметить, что матрица c в функции Determinant уходит в утечку памяти.

