Sudoku Solver in C, runs perfectly, but ends with a segmentation error. Can't find the source -


i have written program in c solved sudoku puzzles. works perfectly, , prints out correct solved puzzle, however, before program should end, segmentation fault , program crashes. struggling find problem coming from.

sorry large amount of code, thought if guys saw everything.

(also sorry if there bad c practices, noob.)

#include <stdio.h> #include <math.h> #include <stdbool.h>  struct table{   int cells[9][9];   bool fixed[9][9]; };  void enternum(struct table* t); void solver(struct table g); void draw(struct table t); bool checkinput(struct table* t);  int main(){   setbuf(stdout, null);   struct table t;   struct table* tp = &t;    int x, y;   bool loop = true;   while(loop == true){     for(x = 0; x < 9; x++){       for(y = 0; y < 9; y++){         t.cells[x][y] = 0;       }     }     draw(t);     enternum(tp);     draw(t);      if(checkinput(tp)){       loop = false;     }else{       printf("\n invalid soduku puzzle\n");     }   }   solver(t);   return 0; }  void draw(struct table t){   printf("\n%d %d %d | %d %d %d | %d %d %d\n", t.cells[0][0], t.cells[0][1], t.cells[0][2], t.cells[0][3], t.cells[0][4], t.cells[0][5], t.cells[0][6], t.cells[0][7], t.cells[0][8]);   printf("%d %d %d | %d %d %d | %d %d %d\n", t.cells[1][0], t.cells[1][1], t.cells[1][2], t.cells[1][3], t.cells[1][4], t.cells[1][5], t.cells[1][6], t.cells[1][7], t.cells[1][8]);   printf("%d %d %d | %d %d %d | %d %d %d\n", t.cells[2][0], t.cells[2][1], t.cells[2][2], t.cells[2][3], t.cells[2][4], t.cells[2][5], t.cells[2][6], t.cells[2][7], t.cells[2][8]);   printf("---------------------\n");   printf("%d %d %d | %d %d %d | %d %d %d\n", t.cells[3][0], t.cells[3][1], t.cells[3][2], t.cells[3][3], t.cells[3][4], t.cells[3][5], t.cells[3][6], t.cells[3][7], t.cells[3][8]);   printf("%d %d %d | %d %d %d | %d %d %d\n", t.cells[4][0], t.cells[4][1], t.cells[4][2], t.cells[4][3], t.cells[4][4], t.cells[4][5], t.cells[4][6], t.cells[4][7], t.cells[4][8]);   printf("%d %d %d | %d %d %d | %d %d %d\n", t.cells[5][0], t.cells[5][1], t.cells[5][2], t.cells[5][3], t.cells[5][4], t.cells[5][5], t.cells[5][6], t.cells[5][7], t.cells[5][8]);   printf("---------------------\n");   printf("%d %d %d | %d %d %d | %d %d %d\n", t.cells[6][0], t.cells[6][1], t.cells[6][2], t.cells[6][3], t.cells[6][4], t.cells[6][5], t.cells[6][6], t.cells[6][7], t.cells[6][8]);   printf("%d %d %d | %d %d %d | %d %d %d\n", t.cells[7][0], t.cells[7][1], t.cells[7][2], t.cells[7][3], t.cells[7][4], t.cells[7][5], t.cells[7][6], t.cells[7][7], t.cells[7][8]);   printf("%d %d %d | %d %d %d | %d %d %d\n\n", t.cells[8][0], t.cells[8][1], t.cells[8][2], t.cells[8][3], t.cells[8][4], t.cells[8][5], t.cells[8][6], t.cells[8][7], t.cells[8][8]);   }  void enternum(struct table* t){   int oneone, onetwo, onethree, onefour, onefive, onesix, oneseven, oneeight, onenine, twoone, twotwo, twothree, twofour, twofive, twosix, twoseven, twoeight, twonine, threeone, threetwo, threethree, threefour, threefive, threesix, threeseven, threeeight, threenine, fourone, fourtwo, fourthree, fourfour, fourfive, foursix, fourseven, foureight, fournine, fiveone, fivetwo, fivethree, fivefour, fivefive, fivesix, fiveseven, fiveeight, fivenine, sixone, sixtwo, sixthree, sixfour, sixfive, sixsix, sixseven, sixeight, sixnine, sevenone, seventwo, seventhree, sevenfour, sevenfive, sevensix, sevenseven, seveneight, sevennine, eightone, eighttwo, eightthree, eightfour, eightfive, eightsix, eightseven, eighteight, eightnine, nineone, ninetwo, ninethree, ninefour, ninefive, ninesix, nineseven, nineeight, ninenine;    char input[50];   bool loop = true;   while(loop){     printf("enter numbers in first line of puzzle, 0 blanks:\n");     if(fgets(input, 50, stdin) == null || sscanf(input, "%d %d %d %d %d %d %d %d %d", &oneone, &onetwo, &onethree, &onefour, &onefive, &onesix, &oneseven, &oneeight, &onenine) != 9 || oneone < 0 || oneone > 9 || onetwo < 0 || onetwo > 9 || onethree < 0 || onethree > 9 || onefour < 0 || onefour > 9 || onefive < 0 || onefive > 9 || onesix < 0 || onesix > 9 || oneseven < 0 || oneseven > 9 || oneeight < 0 || oneeight > 9 || onenine < 0 || onenine > 9){       printf("incorrect input. try again:\n");     }else{       loop = false;     }   }   loop = true;   while(loop){     printf("enter numbers in second line of puzzle, 0 blanks:\n");     if(fgets(input, 50, stdin) == null || sscanf(input, "%d %d %d %d %d %d %d %d %d", &twoone, &twotwo, &twothree, &twofour, &twofive, &twosix, &twoseven, &twoeight, &twonine) != 9 || twoone < 0 || twoone > 9 || twotwo < 0 || twotwo > 9 || twothree < 0 || twothree > 9 || twofour < 0 || twofour > 9 || twofive < 0 || twofive > 9 || twosix < 0 || twosix > 9 || twoseven < 0 || twoseven > 9 || twoeight < 0 || twoeight > 9 || twonine < 0 || twonine > 9){       printf("incorrect input. try again:\n");     }else{       loop = false;     }   }   loop = true;   while(loop){     printf("enter numbers in third line of puzzle, 0 blanks:\n");     if(fgets(input, 50, stdin) == null || sscanf(input, "%d %d %d %d %d %d %d %d %d", &threeone, &threetwo, &threethree, &threefour, &threefive, &threesix, &threeseven, &threeeight, &threenine) != 9 || threeone < 0 || threeone > 9 || threetwo < 0 || threetwo > 9 || threethree < 0 || threethree > 9 || threefour < 0 || threefour > 9 || threefive < 0 || threefive > 9 || threesix < 0 || threesix > 9 || threeseven < 0 || threeseven > 9 || threeeight < 0 || threeeight > 9 || threenine < 0 || threenine > 9){       printf("incorrect input. try again:\n");     }else{       loop = false;     }   }    loop = true;   while(loop){     printf("enter numbers in fourth line of puzzle, 0 blanks:\n");     if(fgets(input, 50, stdin) == null || sscanf(input, "%d %d %d %d %d %d %d %d %d", &fourone, &fourtwo, &fourthree, &fourfour, &fourfive, &foursix, &fourseven, &foureight, &fournine) != 9 || fourone < 0 || fourone > 9 || fourtwo < 0 || fourtwo > 9 || fourthree < 0 || fourthree > 9 || fourfour < 0 || fourfour > 9 || fourfive < 0 || fourfive > 9 || foursix < 0 || foursix > 9 || fourseven < 0 || fourseven > 9 || foureight < 0 || foureight > 9 || fournine < 0 || fournine > 9){       printf("incorrect input. try again:\n");     }else{       loop = false;     }   }    loop = true;   while(loop){     printf("enter numbers in fifth line of puzzle, 0 blanks:\n");     if(fgets(input, 50, stdin) == null || sscanf(input, "%d %d %d %d %d %d %d %d %d", &fiveone, &fivetwo, &fivethree, &fivefour, &fivefive, &fivesix, &fiveseven, &fiveeight, &fivenine) != 9 || fiveone < 0 || fiveone > 9 || fivetwo < 0 || fivetwo > 9 || fivethree < 0 || fivethree > 9 || fivefour < 0 || fivefour > 9 || fivefive < 0 || fivefive > 9 || fivesix < 0 || fivesix > 9 || fiveseven < 0 || fiveseven > 9 || fiveeight < 0 || fiveeight > 9 || fivenine < 0 || fivenine > 9){       printf("incorrect input. try again:\n");     }else{       loop = false;     }   }    loop = true;   while(loop){     printf("enter numbers in sixth line of puzzle, 0 blanks:\n");     if(fgets(input, 50, stdin) == null || sscanf(input, "%d %d %d %d %d %d %d %d %d", &sixone, &sixtwo, &sixthree, &sixfour, &sixfive, &sixsix, &sixseven, &sixeight, &sixnine) != 9 || sixone < 0 || sixone > 9 || sixtwo < 0 || sixtwo > 9 || sixthree < 0 || sixthree > 9 || sixfour < 0 || sixfour > 9 || sixfive < 0 || sixfive > 9 || sixsix < 0 || sixsix > 9 || sixseven < 0 || sixseven > 9 || sixeight < 0 || sixeight > 9 || sixnine < 0 || sixnine > 9){       printf("incorrect input. try again:\n");     }else{       loop = false;     }   }    loop = true;   while(loop){     printf("enter numbers in seventh line of puzzle, 0 blanks:\n");     if(fgets(input, 50, stdin) == null || sscanf(input, "%d %d %d %d %d %d %d %d %d", &sevenone, &seventwo, &seventhree, &sevenfour, &sevenfive, &sevensix, &sevenseven, &seveneight, &sevennine) != 9 || sevenone < 0 || sevenone > 9 || seventwo < 0 || seventwo > 9 || seventhree < 0 || seventhree > 9 || sevenfour < 0 || sevenfour > 9 || sevenfive < 0 || sevenfive > 9 || sevensix < 0 || sevensix > 9 || sevenseven < 0 || sevenseven > 9 || seveneight < 0 || seveneight > 9 || sevennine < 0 || sevennine > 9){       printf("incorrect input. try again:\n");     }else{       loop = false;     }   }    loop = true;   while(loop){     printf("enter numbers in eighth line of puzzle, 0 blanks:\n");     if(fgets(input, 50, stdin) == null || sscanf(input, "%d %d %d %d %d %d %d %d %d", &eightone, &eighttwo, &eightthree, &eightfour, &eightfive, &eightsix, &eightseven, &eighteight, &eightnine) != 9 || eightone < 0 || eightone > 9 || eighttwo < 0 || eighttwo > 9 || eightthree < 0 || eightthree > 9 || eightfour < 0 || eightfour > 9 || eightfive < 0 || eightfive > 9 || eightsix < 0 || eightsix > 9 || eightseven < 0 || eightseven > 9 || eighteight < 0 || eighteight > 9 || eightnine < 0 || eightnine > 9){       printf("incorrect input. try again:\n");     }else{       loop = false;     }   }    loop = true;   while(loop){     printf("enter numbers in ninth line of puzzle, 0 blanks:\n");     if(fgets(input, 50, stdin) == null || sscanf(input, "%d %d %d %d %d %d %d %d %d", &nineone, &ninetwo, &ninethree, &ninefour, &ninefive, &ninesix, &nineseven, &nineeight, &ninenine) != 9 || nineone < 0 || nineone > 9 || ninetwo < 0 || ninetwo > 9 || ninethree < 0 || ninethree > 9 || ninefour < 0 || ninefour > 9 || ninefive < 0 || ninefive > 9 || ninesix < 0 || ninesix > 9 || nineseven < 0 || nineseven > 9 || nineeight < 0 || nineeight > 9 || ninenine < 0 || ninenine > 9){       printf("incorrect input. try again:\n");     }else{       loop = false;     }   }    t->cells[0][0] = oneone;   t->cells[0][1] = onetwo;   t->cells[0][2] = onethree;   t->cells[0][3] = onefour;   t->cells[0][4] = onefive;   t->cells[0][6] = oneseven;   t->cells[0][5] = onesix;   t->cells[0][7] = oneeight;   t->cells[0][8] = onenine;   t->cells[1][0] = twoone;   t->cells[1][1] = twotwo;   t->cells[1][2] = twothree;   t->cells[1][3] = twofour;   t->cells[1][4] = twofive;   t->cells[1][6] = twoseven;   t->cells[1][5] = twosix;   t->cells[1][7] = twoeight;   t->cells[1][8] = twonine;   t->cells[2][1] = threetwo;   t->cells[2][0] = threeone;   t->cells[2][2] = threethree;   t->cells[2][3] = threefour;   t->cells[2][4] = threefive;   t->cells[2][5] = threesix;   t->cells[2][6] = threeseven;   t->cells[2][7] = threeeight;   t->cells[2][8] = threenine;   t->cells[3][0] = fourone;   t->cells[3][1] = fourtwo;   t->cells[3][3] = fourfour;   t->cells[3][2] = fourthree;   t->cells[3][4] = fourfive;   t->cells[3][5] = foursix;   t->cells[3][6] = fourseven;   t->cells[3][7] = foureight;   t->cells[3][8] = fournine;   t->cells[4][0] = fiveone;   t->cells[4][1] = fivetwo;   t->cells[4][2] = fivethree;   t->cells[4][3] = fivefour;   t->cells[4][4] = fivefive;   t->cells[4][6] = fiveseven;   t->cells[4][5] = fivesix;   t->cells[4][7] = fiveeight;   t->cells[4][8] = fivenine;   t->cells[5][0] = sixone;   t->cells[5][2] = sixthree;   t->cells[5][1] = sixtwo;   t->cells[5][3] = sixfour;   t->cells[5][4] = sixfive;   t->cells[5][5] = sixsix;   t->cells[5][6] = sixseven;   t->cells[5][7] = sixeight;   t->cells[5][8] = sixnine;   t->cells[6][0] = sevenone;   t->cells[6][1] = seventwo;   t->cells[6][2] = seventhree;   t->cells[6][3] = sevenfour;   t->cells[6][5] = sevensix;   t->cells[6][4] = sevenfive;   t->cells[6][6] = sevenseven;   t->cells[6][8] = sevennine;   t->cells[6][7] = seveneight;   t->cells[7][0] = eightone;   t->cells[7][1] = eighttwo;   t->cells[7][2] = eightthree;   t->cells[7][4] = eightfive;   t->cells[7][3] = eightfour;   t->cells[7][5] = eightsix;   t->cells[7][6] = eightseven;   t->cells[7][7] = eighteight;   t->cells[7][8] = eightnine;   t->cells[8][0] = nineone;   t->cells[8][1] = ninetwo;   t->cells[8][2] = ninethree;   t->cells[8][3] = ninefour;   t->cells[8][4] = ninefive;   t->cells[8][5] = ninesix;   t->cells[8][6] = nineseven;   t->cells[8][7] = nineeight;   t->cells[8][8] = ninenine; }  bool checkinput(struct table* t){    for(int z = 0; z < 9; z ++){     for(int y = 0; y < 9; y++){       for(int x = 0; x < 9; x++){         if(t->cells[y][z] == t->cells[y][x] && t->cells[y][z] != 0 && z != x){           return false;         }       }     }   }    for(int z = 0; z < 9; z ++){     for(int y = 0; y < 9; y++){       for(int x = 0; x < 9; x++){         if(t->cells[z][y] == t->cells[x][y] && t->cells[z][y] != 0 && z != x){           return false;         }       }     }   }    for(int x = 0; x < 3; x++ ){     for(int y = 0; y < 3; y ++){       for(int m = 0; m < 3; m++){         for(int n = 0; n < 3; n ++){           if(t->cells[x][y] == t->cells[m][n] && x != m && y != n && t->cells[x][y] != 0){             return false;           }         }       }     }   }    for(int x = 3; x < 6; x++ ){     for(int y = 0; y < 3; y ++){       for(int m = 3; m < 6; m++){         for(int n = 0; n < 3; n ++){           if(t->cells[x][y] == t->cells[m][n] && x != m && y != n && t->cells[x][y] != 0){             return false;           }         }       }     }   }    for(int x = 6; x < 9; x++ ){     for(int y = 0; y < 3; y ++){       for(int m = 6; m < 9; m++){         for(int n = 0; n < 3; n ++){           if(t->cells[x][y] == t->cells[m][n] && x != m && y != n && t->cells[x][y] != 0){             return false;           }         }       }     }   }    for(int x = 0; x < 3; x++ ){     for(int y = 3; y < 6; y ++){       for(int m = 0; m < 3; m++){         for(int n = 3; n < 6; n ++){           if(t->cells[x][y] == t->cells[m][n] && x != m && y != n && t->cells[x][y] != 0){             return false;           }         }       }     }   }    for(int x = 3; x < 6; x++ ){     for(int y = 3; y < 6; y ++){       for(int m = 3; m < 6; m++){         for(int n = 3; n < 6; n ++){           if(t->cells[x][y] == t->cells[m][n] && x != m && y != n && t->cells[x][y] != 0){             return false;           }         }       }     }   }    for(int x = 6; x < 9; x++ ){     for(int y = 3; y < 6; y ++){       for(int m = 6; m < 9; m++){         for(int n = 3; n < 6; n ++){           if(t->cells[x][y] == t->cells[m][n] && x != m && y != n && t->cells[x][y] != 0){             return false;           }         }       }     }   }    for(int x = 0; x < 3; x++ ){     for(int y = 6; y < 9; y ++){       for(int m = 0; m < 3; m++){         for(int n = 6; n < 9; n ++){           if(t->cells[x][y] == t->cells[m][n] && x != m && y != n && t->cells[x][y] != 0){             return false;           }         }       }     }   }    for(int x = 3; x < 6; x++ ){     for(int y = 6; y < 9; y ++){       for(int m = 3; m < 6; m++){         for(int n = 6; n < 9; n ++){           if(t->cells[x][y] == t->cells[m][n] && x != m && y != n && t->cells[x][y] != 0){             return false;           }         }       }     }   }    for(int x = 6; x < 9; x++ ){     for(int y = 6; y < 9; y ++){       for(int m = 6; m < 9; m++){         for(int n = 6; n < 9; n ++){           if(t->cells[x][y] == t->cells[m][n] && x != m && y != n && t->cells[x][y] != 0){             return false;           }         }       }     }   }    return true; }  void solver(struct table g){    struct table* t = &g;    for(int x = 0; x < 9; x++){     for(int y = 0; y < 9; y++){       if(t->cells[x][y] != 0){         t->fixed[x][y] = true;       }else{         t->fixed[x][y] = false;       }     }   }    for(int x = 0; x < 9; x++){     for(int y = 0; y < 9; y++){       if(t->fixed[x][y] == false){         t->cells[x][y]++;         while(!checkinput(t)){             t->cells[x][y]++;           }         if(t->cells[x][y] == 10){           t->cells[x][y] = 0;           if(y == 0){             y = 7;             x = x -2;             }else{             y = y - 2;           }           while(t->fixed[x][y+1] == true){             y--;           }         }       }     }   }    printf("your solved puzzle is: \n");   draw(g);  } 

do not cross table boundaries y index below 0 or above 8 , add protections while loops eg:

    while  ( (y>=-1) && (y < 8) && (t->fixed[x][y+1] == true) ) {...}      while  ( (y>= 1) && (y < 8) && (t->fixed[x][y+1] == true) ) {y--;} 

Comments