Constantes de cadena frente a matrices de caracteres en C [duplicado]

Posible duplicado:
¿Cuál es la diferencia entre char s [] y char * s en C?

Más de una pregunta general en lugar de tratar de arreglar algo, he estado leyendo el libro del lenguaje de programación C y se encargan de hacer la distinción entre

char amessage[] = "blah";
char *pmessage = "blah";

La diferencia es que uno es una matriz de caracteres y el otro un puntero a una constante de cadena. Dicen que modificar la matriz de caracteres es aceptable, pero no debe modificar las constantes de cadena, ya que desencadena un comportamiento indefinido. Mi pregunta es: ¿la constante de cadena no está almacenada en la memoria de la misma manera que la matriz de caracteres? ¿Por qué puedo modificarlo como en

char *p = "this is a string constant";
*(p+2) = 'a';
printf("%s", p);

Termina imprimiendo "eso es una constante de cadena" como es de esperar. Puedo entender cómo tendría sentido como una cadenaconstant no debería terminar siendo cambiado en tiempo de ejecución, ya que podría confundir a otros / a usted mismo trabajando en su código, no esperando que cambie su valor, sino en términos puramente funcionales, qué tiene de malo, cuál es el comportamiento indefinido que podría desencadenar y cómo ¿Mecánicamente podría ser contraproducente cuando una matriz de caracteres no lo haría? Me pregunto si me falta algo sobre cómo funcionan las constantes de cadena en la memoria y cómo los ve el compilador.

Respuestas a la pregunta(3)

Su respuesta a la pregunta