0
#include iostream>
#include stdlib.h>


int main()
{
    setlocale(LC_ALL, "ru");
    system("color 70");
    char** array;
    int n, m;
    std::cout << "Введите размер поля N(1 <= N <= 200)" << std::endl;
    std::cin >> n;
    std::cout << "Введите размер поля M(1 <= M <= 200)" << std::endl;
    std::cin >> m;
    array = (char**)malloc(n * sizeof(char*));
    for (int i = 0; i < m; i++)
    {
        array[i] = (char*)malloc(m * sizeof(char));
    }
    srand(time(NULL));
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++)
        {
            if (rand() % 5 == 0)
                array[i][j] = '*';
            else array[i][j] = '.';
        }
    }
    std::cout << "Исходное поле с рандомным кол-вом мин" << std::endl;
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++)
        {
            std::cout << array[i][j] << " ";
        }
        std::cout << "\n";
    }
    std::cout << "Конечное поле \n\n" << std::endl;

    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= m; j++)
        {
            int a = 0;
            if (array[i][j] == '*') continue;   //Смотрел дебагером, при i=4, j=1 вылазит это:
            if (array[i + 1][j] == '*') a++;    //Необработанное исключение по адресу 0x00576E41 в TASK14.exe: 0xC0000005: нарушение прав доступа при чтении по адресу 0xFDFDFDFE.

            if (array[i][j + 1] == '*') a++;
            if (array[i - 1][j] == '*') a++;
            if (array[i][j - 1] == '*') a++;
            if (array[i + 1][j + 1] == '*') a++;
            if (array[i - 1][j - 1] == '*') a++;
            if (array[i - 1][j + 1] == '*') a++;
            if (array[i + 1][j - 1] == '*') a++;
            array[i][j] = a;
        }

    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++)
        {
            std::cout << array[i][j] << " ";
        }
        std::cout << "\n";
    }

    for (int i = 0; i < n; i++)
        free(array[i]);
    array = 0;
    system("pause");
    return 0;
}
zyzz
  • 1
  • При i =n к какому элементу обращается array[i+1][j] ? Сам цикл уже странный for (int i = 1; i <= n; i++). При i =n уже будет исключение, без всяких +1. – Юрий Козлов Nov 19 '21 at 07:15
  • Цикл выделения памяти должен идти до n, а не до m. 2) Циклы с if'ами выходят за границы массивов. 2) После освобождения памяти в цикле необходимо удалить сам массив указателей. После цикла нужно вызвать free(array), а не просто обнулить указатель.
  • –  Nov 19 '21 at 07:17
  • for (int i = 1; i < n - 1; i++) for (int j = 1; j < m - 1 ; j++) – AlexGlebe Nov 19 '21 at 08:46