Как уже упоминали другие, то, хранится ли содержимое константных строк в постоянной памяти, определяется операционной системой, компилятором и архитектурой чипа.
Точнее, стандарт C указывает, что строки в кавычках считаются имеющими тип "const char []" (или слова на этот счет, у меня нет стандарта под рукой).
Любой код, который пытается изменить содержимое такой строки, вызывает неопределенное поведение. Это означает, что буквально все может произойти в этот момент, и поставщику компилятора даже не требуется документировать, что может произойти.
На практике это означает, что программа на C или C ++, которая хочет быть переносимой, должна избегать изменения константных строк.
В общем, компилятор не позволяет вам изменять содержимое переменных «const», поэтому вы можете считать «const» значением «только для чтения» в большинстве случаев. К сожалению, есть специальное исключение для char * и const char *, в основном по историческим причинам. Это означает, что код такой:
char *x = "Hello, World";
*x = 'h';
будет компилироваться без ошибок или предупреждений, даже если он вызывает неопределенное поведение.