Компилятору разрешено объединять строковые литералы, но это не обязательно.
От 6.4.5 / 6 Строковые литералы:
Не определено, различаются ли эти массивы при условии, что их элементы имеют
соответствующие значения.
Фактически, компилятор может объединить следующий набор литералов:
char* p = "abcdef";
char* q = "def";
такой, что q
может указывать «внутри» строки, на которую указывает p
(то есть, q == &p[3]
).