изучаю алгоритмы через решение задач, компилятор говорит ошибка прав доступа

#include <iostream>
 using namespace std;
int main()
{
int n=0, i=0, k=0, p, sum = 0, t, I, b, s = 0, w = 0, winn=0;
cout << "Введите количесво падающих снежинок\n";
cin >> n; 
int* summ;
summ = new int[n];
int*** mas;
mas  = new int**[n];
mas[i] = new int*[n];
mas[i][k] = new int[6];
cout << "Введите значения лучей снежинок(каждая из снежинок имеет ровно шесть лучей), 
ввод значени числа снежинок осущетвляется по порядку от первого луча первй снежинки до 
 последнего луча крайней.";
for (i = 0; i < n; i++, winn++)                      //перебор значенй 
строки(заполнение таблицы в кждом столбце сумма длин лучей снежинки одинаковая)
{
    for (p = 0; p < 5; p++)                         //перебор значений длин лучичов 
снежинки
    {
        cin >> mas[i][k][p];                         
        sum += mas[i][k][p];                        //суммирование длин лучей снежинки
    }
    if (i == 0)summ[i] = sum;                         //присвоение суммы длин лучей 
первому элементу из массива сумм длин лучей
    else for (t = 0; t <= i; t++)                    //оператор перебора значений 
массива сумм c перезаписью в столбец значений с равной суммой
    {
        if (summ[t] == sum)                         //если текущая сумма равна одной из 
предыдущих массива значений сумм
        {
            I = i;
            i = t;
            for (k = 0; mas[i][k][0] > -1; k++);    //поиск знначения всободного 
столбца
            for (p = 0; p < 5; p++)                 //перезапись значений текущего 
элемента в столбец с той же суммой
            {
                mas[i][k][p] = mas[I][0][p];        //присвоение значения новому 
элементу 
                mas[I][0][p] = -1;                  //"обнуление" текущего элемента

            }
            for (k = 0; k < n; k++)//СРАВНЕНИЕ СНЕЖИНОК (ВЫПОЛНЕНИЕ ОСНОВНОГО ЗАДАНИЯ)
            {
                for (p = 0; p < 5; p++)                                                                        
//перебор значений лучей первой снежинки
                {
                    for (b = 0; b < 5; b++)                                                                         
//перебор значений лучей второй снежинки
                    {
                        if (mas[i][k][p] == mas[i][k + 1][b])                                                       
 //если найдено одинаковое значение лучей снежинок
                        {
                            for (p = 0; p < 6 or s == 6; p++)                                                         
 //перебор значений лучей первой снежики для скравнения всех элементов
                            {
                                if (p == 6) p = 0;                                                              
//перебор значей лучей второй снежинки для сравнения элементов
                                for (b = 0; b < 5; b++)
                                {
                                    if (p == 6) p = 0;                                                          
//перехлод в начало снежинки при достижении крайнего элемента 
                                    if (mas[i][k][p] == mas[i][k + 1][b])s++;                                       
//введение переменной для подсчёта последовательности одинаковх элементов

                                }
                                if (s == 6)w++;                                                                     
//по достижении ряда из 6 одинаковых элементов происходит запись элемента отвечающего 
за вывод ответа задачи
                            }
                            if (w == 1) goto win;

                            for (p = 5; p < 0; p--, s = 0)                                                       
//пербор значения первой снежинки в левую сторону(в случае перевёрнутой снежинки)
                            {
                                if (p % 6 == 0) p = 5;                                                              
//переход к последнему элементу первой снежинки при достижении первого элемента
                                for (b = 5; b < 0; b--)                                                             
//перебор значения второй снежинки в левую стороону
                                {
                                    if (b % 6 == 0) p = 5;                                                          
//переход к последнему элементу второй снежинки при достижении первого 
                                    else if (mas[i][k][p] == mas[i][k + 1][b])s++;                                       
//введение переменной для подсчёта последовательности одинаковх элементов

                                }
                                if (s == 6)w++;                                                                     
//по достижении ряда из 6 одинаковых элементов происходит запись элемента отвечающего 
за вывод ответа задачи


                            }
                            if (w == 1) goto win;
                        }

                    }
                }
            }
            i = I - 1, k = 0;                                                                                       
 //возвращение к предыдущему значению с целью повторной записи текущего
            break;
        }
        else  summ[i] = sum;                                                                                        
 //если не найдётся раного значения в массиве сумм то текущая запишется в новую ячейку
    }
    if (i == n) goto gg ;
}
 win:n = n - winn;
for (winn = 0; winn < n; winn++)
{
    for (p = 0; p < 5; p++)
    {
        cin >> mas[winn][0][p];
    }
}
cout << "есть одинаковые снежинки";
    gg:
cout <<"НЕТ ОДИНАКОВЫХ СНЕЖИНОК";
}

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

Автор решения: Harry

Если это, конечно, не шутка...

mas  = new int**[n];   //Массив указателей на указатели

Инициализируется его единственный i-ый элемент (в этот момент i == 0):

mas[i] = new int*[n];  

И в этом массиве инициализируется единственный k-ый элемент (в этот момент k == 0):

mas[i][k] = new int[6];

А обращаетесь-то вы не только к mas[0][0][], но и к другим элементам, разыменовывая случайные указатели.

Вы должны инициализировать все элементы (например, в цикле).

P.S. Крайне рекомендую почитать это и особенно вот это... P.P.S. Об остальном коде не буду говорить, не смотрел. Однако обилие goto, например, выглядит, скажем так, непривычно. Но если он все же работает, то, надеюсь, вы понимаете, что если ваш код выведет

есть одинаковые снежинки

то он обязательно выведет следом и

НЕТ ОДИНАКОВЫХ СНЕЖИНОК
→ Ссылка