Объектное выделение в C++

char *myfunc() {
    char *temp = "string";
    return temp;
}

В этой части кода, где делает выделение объекта, которым указывают temp произойдите и каков был бы его объем?

Действительно ли эта функция является допустимым способом возвратить символ* указатель?

5
задан Moeb 15 June 2010 в 17:38
поделиться

3 ответа

Правильный ли код?

Да, ваш код (почти) в порядке, потому что "string" является строковым литералом и находится в статическом хранилище.

Примечание: Указатель - это просто переменная, которая хранит адрес памяти. Эта строка просто хранит адрес строкового литерала "string" в переменной под названием temp.

char *temp = "string";

Стандарт C++ гарантирует, что строковый литерал будет оставаться в памяти в течение всего времени работы программы, как определено ниже. Это означает, что вы можете свободно использовать этот адрес памяти в любой области видимости в течение всего времени работы вашей программы.


Почему?

В стандарте C++03 (текущем) сказано следующее:

Обычный строковый литерал имеет тип "массив из n const char" и статический длительность хранения (3.7),

И раздел 3.7.1 - 1:

Все объекты, которые не имеют динамической длительности хранения и не являются локальными, имеют динамическую длительность хранения. продолжительность хранения, ни являются локальными, имеют статическую длительность хранения. Хранение для этих объектов должно длиться в течение в течение всего времени работы программы.


Предупреждение:

В вашем коде вы возвращаете char*, на самом деле вы должны возвращать const char *. Это неопределенное поведение, если вы пытаетесь модифицировать строковый литерал, и возвращаемое значение вашей функции не должно притворяться, что вы это допускаете.

Попутное замечание к предупреждению. Если у вас в коде в двух разных местах есть строка с именем "string", то являются ли они разными строками, определяется реализацией.

13
ответ дан 18 December 2019 в 07:08
поделиться

Как уже упоминалось, он выделяется во время компиляции; это буквально.

Но в C++ это не настолько допустимо, насколько это возможно, потому что указатель не указывает на const char. В общем, это то, что вы должны рассмотреть совсем по-другому.

3
ответ дан 18 December 2019 в 07:08
поделиться

Этот фрагмент кода работает (и является правильным), потому что объект «строка» представляет собой статические данные, которые «выделяются» (так сказать) во время компиляции - компоновщик помещает их в специальный раздел исполняемого файла.

Но совместимый со стандартами C ++ должен говорить const char * вместо char * при обращении к статическим данным.

6
ответ дан 18 December 2019 в 07:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: