Optimización en C de los literales de cuerdas.

Solo he estado inspeccionando lo siguiente en gdb:

char *a[] = {"one","two","three","four"};
char *b[] = {"one","two","three","four"};
char *c[] = {"two","three","four","five"};
char *d[] = {"one","three","four","six"};

y me sale lo siguiente:

(gdb) p a
$17 = {0x80961a4 "one", 0x80961a8 "two", 0x80961ac "three", 0x80961b2 "four"}
(gdb) p b
$18 = {0x80961a4 "one", 0x80961a8 "two", 0x80961ac "three", 0x80961b2 "four"}
(gdb) p c
$19 = {0x80961a8 "two", 0x80961ac "three", 0x80961b2 "four", 0x80961b7 "five"}
(gdb) p d
$20 = {0x80961a4 "one", 0x80961ac "three", 0x80961b2 "four", 0x80961bc "six"}

Estoy realmente sorprendido de que los punteros de cadena sean iguales para palabras equivalentes. Pensé que a cada cadena se le habría asignado su propia memoria en la pila, independientemente de si era lo mismo que una cadena en otra matriz.

¿Es este un ejemplo de algún tipo de optimización del compilador o es un comportamiento estándar para la declaración de cadenas de este tipo?

Respuestas a la pregunta(2)

Su respuesta a la pregunta