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