converter char [] [] para char ** causa segfault?

Ok, meu C está um pouco enferrujado, mas imaginei que faria meu próximo (pequeno) projeto em C para que eu pudesse fazer o polimento de volta nele e menos de 20 linhas já tenho uma falha seg.

Este é o meu código completo:

#define ROWS 4
#define COLS 4

char main_map[ROWS][COLS+1]={
  "a.bb",
  "a.c.",
  "adc.",
  ".dc."};

 void print_map(char** map){
  int i;
  for(i=0;i<ROWS;i++){
    puts(map[i]); //segfault here
  }
 }



int main(){
  print_map(main_map); //if I comment out this line it will work.
  puts(main_map[3]);
  return 0;
}

Estou completamente confuso sobre como isso está causando um segfault. O que está acontecendo ao transmitir a partir de[][] para**!? Esse é o único aviso que recebo.

rushhour.c:23:3: warning: passing argument 1 of ‘print_map’ from incompatible pointer type
rushhour.c:13:7: note: expected ‘char **’ but argument is of type ‘char (*)[5]’

Estão[][] e** tipos de ponteiros realmente não compatíveis? Eles parecem que são apenas sintaxe para mim.

questionAnswers(3)

yourAnswerToTheQuestion