Optymalizacja C literałów łańcuchowych

właśnie sprawdzałem następujące elementy w 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"};

a otrzymuję:

(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"}

Jestem naprawdę zaskoczony, że wskaźniki ciągów są takie same dla równoważnych słów. Pomyślałbym, że każdy ciąg zostałby przydzielony do własnej pamięci na stosie, niezależnie od tego, czy był taki sam jak łańcuch w innej tablicy.

Czy jest to przykład jakiegoś rodzaju optymalizacji kompilatora, czy jest to standardowe zachowanie dla deklaracji łańcuchowej tego typu?

questionAnswers(2)

yourAnswerToTheQuestion