Вы пытаетесь изменить строковый литерал. Согласно Стандарту, это вызывает неопределенное поведение . Еще одна вещь, которую нужно иметь в виду (связанная), это то, что строковые литералы всегда имеют тип const char*
. Существует специальное разрешение для преобразования указателя на строковый литерал в char*
, убирая квалификатор const
, но базовая строка все еще равна . Таким образом, делая то, что вы делаете, вы пытаетесь изменить const
. Это также вызывает неопределенное поведение и похоже на попытку сделать это:
const char* val = "hello";
char* modifyable_val = const_cast<char*>(val);
modifyable_val[1] = 'n'; // this evokes UB
Вместо того, чтобы возвращать const char*
из вашей функции, возвращайте string
по значению. Это создаст новый string
на основе строкового литерала, и вызывающий код может делать все, что захочет:
#include <string>
std::string Function1()
{
return “Some text”;
}
... позже:
std::string s = Function1();
s[1] = 'a';
Теперь, если вы пытаетесь изменить значение, которое Function()
возвращается, вам придется сделать что-то еще. Я бы использовал класс:
#include <string>
class MyGizmo
{
public:
std::string str_;
MyGizmo() : str_("Some text") {};
};
int main()
{
MyGizmo gizmo;
gizmo.str_[1] = 'n';
}