Literales de cadena: puntero vs. char array

En esta declaración:

char *a = "string1"

¿Qué es exactamente la cadena literal? Lo esstring1? Porque este hilo¿Cuál es el tipo de cadenas literales en C y C ++? Dice algo diferente.

Hasta mi conocimiento

int main()
{
    char *a = "string1"; //is a string- literals allocated memory in read-only section.
    char b[] = "string2"; //is a array char where memory will be allocated in stack.

    a[0] = 'X'; //Not allowed. It is an undefined Behaviour. For me, it Seg Faults. 
    b[0] = 'Y'; //Valid. 

    return 0;
} 

Por favor agregue algunos detalles que no sean los puntos mencionados anteriormente. Gracias.

Salida de depuración que muestra error en a[0] = 'Y';

Reading symbols from /home/jay/Desktop/MI/chararr/a.out...done.
(gdb) b main
Breakpoint 1 at 0x40056c: file ddd.c, line 4.
(gdb) r
Starting program: /home/jay/Desktop/MI/chararr/a.out 

Breakpoint 1, main () at ddd.c:4
4   {
(gdb) n
6   char *a = "string1";
(gdb) n
7   char b[] = "string2";
(gdb) 
9   a[0] = 'Y';
(gdb) 

Program received signal SIGSEGV, Segmentation fault.
0x0000000000400595 in main () at ddd.c:9

Respuestas a la pregunta(1)

Su respuesta a la pregunta