2013-03-12 5 views
7

Я пытаюсь удалить константу из переменной (char *), но по какой-то причине, когда я пытаюсь изменить значение, исходное значение константной переменной все равно остается неизменным ,Удалить константу из переменной

const char* str1 = "david"; 
char* str2 = const_cast<char *> (str1); 
str2 = "tna"; 

теперь изменяется значение str2, но первоначальное значение str1 остается тем же, я уже посмотрел его на Google, но не смог найти однозначный ответ.

при использовании const_cast и изменении значения, если исходник константной переменной также изменится?

ответ

10

Тип str1: const char*. Это char, то есть const, а не указатель. То есть, это указатель на const char. Это означает, что вы не можете сделать это:

str1[0] = 't'; 

Это изменит значение одного из constchar с.

Теперь, что вы делаете, когда вы делаете str2 = "tna";, меняется значение указателя. Хорошо. Вы просто меняете str2, чтобы указать на другой строковый литерал. Теперь str1 и str2 указывают на разные строки.

С вашей не- const указатель str2, вы могли сделать str2[0] = 't'; - однако, вы должны были бы неопределенное поведение. Вы не можете изменить то, что было изначально объявлено const. В частности, строковые литералы хранятся в памяти только для чтения, и попытка их изменения принесет вам страшную несчастье.

Если вы хотите взять строку буквальной и изменить его безопасно, инициализация в массиве с ним:

char str1[] = "david"; 

Это будет копировать символы из строки буквальной над к char массиву. Затем вы можете изменить их по своему вкусу.

+0

Хорошо, так есть способ, которым я могу изменить значение переменной const char * с помощью кастинга? –

+0

@DavidFaiz Вы можете изменить указатель как можно точнее без актерского состава. Вы * не можете * изменить 'char', если вы указали указатель на строковый литерал, который у вас есть. Строковые литералы постоянны. См. Мое последнее редактирование о том, как скопировать строковый литерал в массив. –

+0

Я только что видел его и получил! Большое спасибо за быстрый ответ! так что я не могу изменить строку literal, но просто использую переменную const char и указываю на другую. –

3

str2 - просто указатель. И ваш код просто изменяет значение указателя, адрес, а не строку, на которую он указывает.

Более того, то, что вы пытаетесь сделать, ведет к неопределенным поведением и, скорее всего, приведет к ошибкам во время выполнения. Все современные компиляторы будут хранить вашу строку "david" в постоянной памяти. Попытки изменить эту память приведут к ошибкам защиты памяти.