I managed to solve this, by adding bounds checking in another helper function. If anyone can suggest a better way please inform me.
Code:
int checkMove(char *p, int y, int x) {
if (arr[(y+1)][(x+1)]&&arr[(y-1)][(x-1)]==p&&inbounds(y+1, x+1)&&inbounds(y-1, x-1)||
arr[(y+1)][(x-1)]&&arr[(y-1)][(x+1)]==p&&inbounds(y+1, x-1)&&inbounds(y-1, x+1)||
arr[(y+1)][(x+1)]&&arr[(y+2)][(x+2)]==p&&inbounds(y+1, x+1)&&inbounds(y+2, x+2)||
arr[(y-1)][(x-1)]&&arr[(y-2)][(x-2)]==p&&inbounds(y-1, x-1)&&inbounds(y-2, x-2)||
arr[(y-1)][(x+1)]&&arr[(y-2)][(x+2)]==p&&inbounds(y-1, x+1)&&inbounds(y-2, x+2)||
arr[(y+1)][(x-1)]&&arr[(y+2)][(x-2)]==p&&inbounds(y+1, x-1)&&inbounds(y+2, x-2)||
arr[(y+1)][x]&&arr[(y-1)][x]==p&&inbounds(y+1, x)&&inbounds(y-1, x)||
arr[(y+1)][x]&&arr[(y+2)][x]==p&&inbounds(y+1, x)&&inbounds(y+2, x)||
arr[(y-1)][x]&&arr[(y-2)][x]==p&&inbounds(y-1, x)&&inbounds(y-2, x)||
arr[y][(x+1)]&&arr[y][((x-1))]==p&&inbounds(y, x+1)&&inbounds(y, x-1)||
arr[y][(x+1)]&&arr[y][(x+2)]==p&&inbounds(y, x+1)&&inbounds(y, x+2)||
arr[y][(x-1)]&&arr[y][(x-2)]==p&&inbounds(y, x-1)&&inbounds(y, x-2)) {
return 1;
} else {
return 0;
}
}
int inbounds (int y, int x) {
return (y >= 0 && y < GRID_SIZE && x >= 0 && x < GRID_SIZE);
}