In-Place String reversa em C

Estou tentando aprender os fundamentos de C, mas não consigo descobrir por que esse código não funciona. O loop while em reverse () causa um erro no barramento. Encontrei um código quase idêntico em um livro de entrevistas de programação como uma solução válida, mas nem esse nem outros métodos semelhantes que vi publicados aqui funcionam para mim sem um erro de barramento.

#include <stdio.h>

void reverse(char* str) {
 char* end = str;
 char tmp = 0;
 if(str) {
  while(*end) {
   end++;
  }
  --end;
  while(end>str) {
   tmp = *end;
   *end-- = *str;
   *str++ = tmp;
  }
 }
}

int main() {
 char* a = "12";
 puts(a);
 reverse(a);
 puts(a);

 return 0;
}

questionAnswers(3)

yourAnswerToTheQuestion