У меня есть несколько вопросов, которые я хотел бы задать о строковых литералах и C-строках.
Итак, если у меня есть что-то вроде этого:
char cstr[] = "c-string";
Как я понимаю,Строковый литерал создается в памяти с завершающим нулевым байтом, например, начиная с адреса 0xA0 и заканчивая 0xA9, и оттуда адрес возвращается и / или приводится к типу char [], который затем указывает на адрес.
В таком случае законно выполнить это:
for (int i = 0; i < (sizeof(array)/sizeof(char)); ++i)
cstr[i] = 97+i;
Итак, в этом смысле можно ли изменять строковые литералы до тех пор, пока они приводятся к типу char []?
Но с обычными указателями я понял, что когда они указывают на строковый литерал в памяти, они не могут изменять содержимое, потому что большинство компиляторов помечают эту память как «Только для чтения» в некотором нижнем ограниченном адресепространство для констант.
char * p = "const cstring";
*p = 'A'; // illegal memory write
Я думаю, что я пытаюсь понять, почему типам char * не разрешено указывать на строковые литералы, как это делают массивы, и изменять их константы?Почему строковые литералы не преобразуются в char *, как в char []?Если у меня возникла неправильная идея или я совершенно не уверен, поправьте меня.