У меня есть несколько вопросов о строковых литералах и 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 []? Если у меня здесь неправильное представление или я полностью отключен, не стесняйтесь поправлять меня.
char * p = "const cstring";
должен выдать ошибку компиляции, поскольку"const cstring"
относится к типуconst char*
(в частности, чтобы вы не использовали его так, как вы используете его в своем примере) - person tylerl   schedule 06.10.2011"const cstring"
не относится к типуconst char*
. - person Lightness Races in Orbit   schedule 20.01.2019const char[N]
, что, по сути, во многом эквивалентноconst char*
. Можно спорить о педантичных деталях, но это только добавляет путаницы, а не ясности. - person tylerl   schedule 27.01.2019