¿Por qué la modificación de un literal de cadena provoca un error de segmentación?

¿Por qué la modificación de un literal de cadena preinicializado causa un error de segmentación? Por ejemplo:

char *str = "Hello world"; str[0] = 'h'; 

Cuando inicializa str a ese valor de cadena, ¿el comstackdor no asigna automáticamente la memoria para esa cadena constante, asigna su ubicación inicial a str y la libera al salir del progtwig?

se encuentra en una sección de solo lectura del espacio de direcciones del proceso porque la cadena literal es una constante. (La variable str no se encuentra en el espacio de solo lectura, pero debe hacerse para que apunte a una ubicación válida de escritura antes de poder usarla de la manera que lo hace).