Является ли код правильным?
Да, ваш код (почти) в порядке, потому что "string"
является строковым литералом и находится в статическом хранилище.
ПримечаниеУказатель - это просто переменная, которая хранит адрес памяти.Эта строка просто хранит адрес строкового литерала "string" внутри переменной с именем temp
.
char *temp = "string";
Стандарт C ++ гарантирует, что строковый литерал будет оставаться в памяти на протяжении всей программы, как определенониже.Это означает, что вы можете свободно использовать этот адрес памяти в любой области в течение всей жизни вашей программы.
Почему?
C ++ 03Стандартный (текущий) имеет это, чтобы сказать:
Обычный строковый литерал имеет тип «массив из n const char» и статическую длительность хранения (3,7),
И раздел3.7.1 - 1:
Все объекты, которые не имеют ни динамической длительности хранения, ни локальной, имеют статическую длительность хранения.Хранение этих объектов должно продолжаться в течение всей программы.
Предупреждение:
В вашем коде вы возвращаете char*
Вы действительно должны возвращать const char *
.Это неопределенное поведение, если вы пытаетесь изменить строковый литерал, и возвращаемое значение вашей функции не должно претендовать на это.
На соответствующей стороне примечания к предупреждению.Если в вашем коде в двух разных местах есть строка с именем "string"
, то зависит от того, являются ли они различными строками, определяется реализацией.