Распределение объектов в C ++ - PullRequest
5 голосов
/ 15 июня 2010
char *myfunc() {
    char *temp = "string";
    return temp;
}

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

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

Ответы [ 3 ]

13 голосов
/ 15 июня 2010

Является ли код правильным?

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

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

char *temp = "string";

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


Почему?

C ++ 03Стандартный (текущий) имеет это, чтобы сказать:

Обычный строковый литерал имеет тип «массив из n const char» и статическую длительность хранения (3,7),

И раздел3.7.1 - 1:

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


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

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

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

6 голосов
/ 15 июня 2010

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

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

3 голосов
/ 15 июня 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...