Inversa de cadena en el lugar en C

Estoy tratando de aprender los fundamentos de C, pero no puedo entender por qué este código no funciona. El ciclo while en reverse () causa un error de bus. Encontré un código casi idéntico en un libro de entrevistas de programación como una solución válida, pero ni este ni otros métodos similares que he visto publicados aquí funcionan para mí sin un error de bus.

#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;
}

Respuestas a la pregunta(3)

Su respuesta a la pregunta