Строковые литералы могут быть разными или нет: это выбор компилятора ( C99 Standard говорит, что он не указан).
Предположим, на минуту, что изменение самих строковых литералов не было UB.
int main(void) {
char *p = "now is the time";
/* compiler makes sure there is a place with "now is the time"
** and makes p point there */
char *q = "time";
/* possibly, the compiler reuses the time from
** the previous string literal */
q[0] = 'd'; /* technically UB: don't do this */
puts(p); /* possibly writes "now is the dime" */
}
Что касается вашего конкретного вопроса: , пока вы не вызываете UB , это безопасно. Память, выделенная компилятором, учитывает все другие виды использования всех других объектов.