2010-06-15 3 views
5
char *myfunc() { 
    char *temp = "string"; 
    return temp; 
} 

В этом фрагменте кода, где происходит выделение объекта, на которое указывает temp, и какова его область действия?Размещение объектов в C++

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

+2

Это домашнее задание? –

+1

@Dirk Eddelbuettel: no. – Moeb

ответ

13

Правильно ли это код?

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

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

char *temp = "string"; 

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


Почему?

Стандарта C++, 03 (ток) это сказать:

Обычная строка символов имеет типа «массив п сопзЬ полукокса» и статическую длительность хранения (3.7),

И раздел 3.7.1 - 1:

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


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

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

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

+0

Спасибо Брайан! – Moeb

6

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

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

+0

Это не требование стандарта. Код Poiuyt полностью легален. Лучше/практиковать/использовать char const * вместо char *, но стандарт не требует этого. –

+2

@Noah: Это неопределенное поведение, хотя если вы измените этот строковый литерал. –

+0

@EFraim, @Brian R. Bondy, @Noah Roberts: Почему строка '' не локальна для 'myfunc()'? – Moeb

3

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

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

+0

+1 для указания проблемы 'const'. – Void

Смежные вопросы