Здесь "Hello"
строковый литерал, который по определению const
. s1
- это указатель на первый элемент этого строкового литерала и поэтому указывает на постоянную память. Вы не можете изменить память только для чтения, и поэтому вы не можете изменить то, на что указывает s1
. Было бы гораздо более accrate и лучше, если бы вы объявили это как:
const char *s1 = "Hello";
В C++ 03, есть специальное правило, которое позволяет назначать указатель на строку буквального к не- const
указателя. Однако это правило было удалено на C++ 11, и теперь ваш код является незаконным.
Это хорошо, потому что даже в C++ 03 вы ничего не можете (с юридической точки зрения) делать с s1
, что вы не могли сделать, если это было const
.
Позже вы делаете что-то явно неправильно:
while(*s2 != '\0')
{
*s1 = *s2; // this line creating problem
s1++;
s2++;
}
Я не удивлен, что строка кода вызывает проблемы для вас - это вызывает неопределенное поведение, потому что вы изменяете память только для чтения.
Похоже, что вы действительно пытаетесь создать строку, которая инициализируется некоторым известным (неизменным) значением, а затем модифицирует строку. Чтобы сделать это, вы должны сделать копию строкового литерала. Самый простой способ сделать это состоит в использовании std::string
:
std::string s1 = "Hello";
Здесь "Hello"
еще строковый, но s1
строится отходящим от него. s1
полностью отделен от строкового литерала, и теперь вы можете изменить его, как хотите.
** Никогда ** используйте не-const 'char *' для указания на строковый литерал. – chris
Действительно ли это C++? 'char * s1 =" Hello ";' даже не компилируется. (Не следует «while (...)
' ...>. <) –
@ H2CO3, все еще может быть pre-C++ 11. Это только устарело. В любом случае, AFAIK, компиляторы по-прежнему принимают его на C++ 11 по любой причине. – chris