me parece tu codigo excesivamente anidado y complicado para algo simple...
void comprobacion(int rejilla[][columnas], int filas, int col){
int i, j, x, y, reja[filas][col], vivas;
for(i=0; i<filas; i++){
for(j=0; j<col; j++){
if(rejilla[i][j] == 0){
vivas = 0;
for(x=0; x<3; x++){
for(y=0; y<3; y++){
if((i+1)-x == i && (j+1)-y == j){
reja[i][j] = rejilla[i][j];
}else if(rejilla[(i+1)-x][(j+1)-y] == 1){
vivas++;
}
}
}
if( vivas == 3){
reja[i][j] = 1;
}
}else if(rejilla[i][j] == 1){
vivas = 0;
for(x=0; x<3; x++){
for(y=0; y<3; y++){
if((i+1)-x == i && (j+1)-y == j){
reja[i][j] = rejilla[i][j];
}else if(rejilla[(i+1)-x][(j+1)-y] == 1){
vivas++;
}
}
}
if(vivas == 2 || vivas == 3){
reja[i][j] = 1;
}else{
reja[i][j] = 0;
}
}
}
}
for(i=0; i<filas; i++){
for(j=0; j<col; j++){
rejilla[i][j] = reja[i][j];
}
}
}
por cosas de legibilidad lo cambiaría a
por otro lado no estoy seguro si compruebas los si está en el borde
void comprobacion(int rejilla[][columnas], int filas, int col){
int i, j, reja[filas][col], vivas;
for(i=0; i<filas; i++){
for(j=0; j<col; j++){
vivas = rejilla[i+0][j+0];
if(i > 0){
if(j > 0)
vivas += rejilla[i-1][j-1];
vivas += rejilla[i-1][j+0];
if(j < col -1)
vivas += rejilla[i-1][j+1];
}
if(j > 0)
vivas += rejilla[i+0][j-1];
vivas += rejilla[i+0][j+0];
if(j < col -1)
vivas += rejilla[i+0][j+1];
if(i < filas-1){
if(j > 0)
vivas += rejilla[i+1][j-1];
vivas += rejilla[i+1][j+0];
if(j < col -1)
vivas += rejilla[i+1][j+1];
}
reja[i][j] = 0;
if(vivas == 2 || vivas == 3){
reja[i][j] = 1;
}
}
}
for(i=0; i<filas; i++){
for(j=0; j<col; j++){
rejilla[i][j] = reja[i][j];
}
}
}
}