Segmentation fault(core dumped)

Пишу Game of Live. При заполнении массива столкнулся с ошибкой Segmentation fault(core dumped). Память вроде выделяю верно. При заполнении кажется выходит за пределы массива и выделенной памяти, однако не могу понять в чем дело.


#include <stdio.h>
#include <stdlib.h>
#include <ncurses.h>
#include <unistd.h>
#define ROWS 25
#define COLS 80

void inputMatrix(int **arr);  //Заполнение двумерной матрицы. Перерисовка
void updateMatrix(int **matrix, int **matrix1); //Обновление состояние матрицы
int check_Cell(int **matrix, int n, int m); //Проверка состояние клетки. Безграничность поля. Подсчет живых соседей клетки. Возврат состояния
void replace (int **matrix, int **matrix1); // замена

int main() {
    int flag = 0;
    int time_milisec = 500;
    int **matrix = (int **)malloc(ROWS * sizeof(int*));
    int **matrix1 = (int **)malloc(ROWS * sizeof(int*));
    for(int i = 0; i < ROWS; i++){
        matrix[i] = (int*)malloc(COLS * sizeof(int));
        matrix1[i] = (int*)malloc(COLS * sizeof(int));
    }
    inputMatrix(matrix);
    if (freopen("/dev/tty", "r", stdin)) initscr();  
    nodelay(stdscr, true);
    while(1){
        // char ch = getch();
        // if(ch == 'q') break;
        usleep(time_milisec*1000);
        updateMatrix(matrix, matrix1);
        replace(matrix, matrix1);
    }

    for(int i = 0; i < ROWS; i++)
        free(matrix[i]);
    for(int i = 0 ;i < ROWS; i++)
        free(matrix1[i]);
    free(matrix);
    free(matrix1);
    endwin();
    return flag;
}

void inputMatrix(int **matrix){              
    for(int i = 0; i < ROWS; i++){
        for(int j = 0; j < COLS; j++){
            if(i < ROWS && j < COLS)
                scanf("%d ", &matrix[i][j]);
        }
        printf("\n");
    }
}

void updateMatrix(int **matrix, int **matrix1){ 
    for(int i = 0; i < ROWS; i++){
        for(int j = 0; j < COLS; j++){
            if(check_Cell(matrix, i, j) == 1)
                matrix1[i][j] = 1;
            else 
                matrix1[i][j] = 0;
            if(matrix1[i][j] == 1)
                printf("0");
            else 
                printf(" ");
        }
        printf("\n");
    }
}

void replace (int **matrix, int **matrix1){
    for(int i = 0; i < ROWS; i++){
        for(int j = 0; j < COLS; j++)
            matrix[i][j] = matrix1[i][j];
    }
}

int check_Cell(int **matrix, int n, int m){ 
    int flag = 0;
    int sumN = 0;

    for(int i = n - 1; i <= n + 1; i++){
        for(int j = m - 1; j <= m + 1; j++) {
            if(i == n && j == m) 
                continue;
            int ii = 0; 
            int jj = 0;
            if(i == -1) 
                ii = n - 1;
            else if (i == n) 
                ii = 0;
            else 
                ii = i;
            if(j == -1)
                jj = m - 1;
            else if(j == m)
                jj = 0;
            else
                jj = j;
            if(matrix[ii][jj] == 1)
                sumN++;
        }   
    }
    int state = matrix[n][m];
    if(state == 1){
        if((sumN > 2 || sumN < 3) && state == 1) {
            flag = 1;
        } 
    } else { 
        if(sumN == 3 && state == 0)
            flag = 1;  
    }
    return flag;
}

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