я пытаюсь удалить константу из переменной (char *), но по какой-то причине, когда я пытаюсь изменить значение, исходное значение константной переменной остается прежним.
const char* str1 = "david";
char* str2 = const_cast<char *> (str1);
str2 = "tna";
теперь значение str2 меняется, но первоначальное значение str1 остается прежним, я посмотрел его в Google, но не смог найти четкого ответа.
при использовании const_cast и изменении значения должен ли также изменяться оригинал переменной const?
Тип str1
является const char*
, Это char
то есть const
, а не указатель. То есть это указатель на const char
, Это означает, что вы не можете сделать это:
str1[0] = 't';
Это изменит значение одного из const
char
s.
Теперь, что вы делаете, когда вы делаете str2 = "tna";
меняет значение указателя. Все в порядке. Ты просто меняешься str2
указать на другой строковый литерал. Сейчас str1
а также str2
указывают на разные строки.
С вашим неconst
указатель str2
, вы мог делать str2[0] = 't';
— однако, у вас будет неопределенное поведение. Вы не можете изменить то, что было первоначально объявлено const
, В частности, строковые литералы хранятся в постоянной памяти, и попытка их изменить принесет вам ужасную неудачу.
Если вы хотите взять строковый литерал и безопасно его изменить, инициализируйте массив с этим:
char str1[] = "david";
Это скопирует символы из строкового литерала в char
массив. Тогда вы можете изменить их по своему вкусу.
str2
это просто указатель. А ваш код просто меняет значение указателя, адреса, а не строки, на которую он указывает.
Более того, то, что вы пытаетесь сделать, приводит к неопределенное поведение, и, скорее всего, приведет к ошибкам во время выполнения. Все современные компиляторы будут хранить вашу строку "david"
в постоянной памяти Попытки изменить эту память приведут к ошибкам защиты памяти.