указатель на временный объект
От: Аноним  
Дата: 22.09.09 10:30
Оценка:
Извиняюсь, за элементарный вопрос!

Будет ли, в данном примере, при вызове функции printf(), утекать память. А если нет, то почему? Ведь в функцию main() возвращается указатель на временный объект. На выходе из функции printf() этого объекта уже нет!

char* MyPrint(void)
{
   char mess[32] = {'b', 'l', 'a', '-', 'b', 'l', 'a', '-', 'b', 'l', 'a'};

   return mess;
}

int main (void)
{
   printf("%s", MyPrint());

   return 0;
}


Спасибо
Re: указатель на временный объект
От: Alexey F  
Дата: 22.09.09 10:44
Оценка:
Здравствуйте, Аноним, Вы писали:

А>
А>char* MyPrint(void)
А>{
А>   char mess[32] = {'b', 'l', 'a', '-', 'b', 'l', 'a', '-', 'b', 'l', 'a'};

А>   return mess;
А>}

А>int main (void)
А>{
А>   printf("%s", MyPrint());

А>   return 0;
А>}
А>


Утекать память не будет, а вот насчёт работать...
mess уничтожается при выходе из MyPrint (т.к. локальный), что выведет printf — не определено.
Re: указатель на временный объект
От: Bell Россия  
Дата: 22.09.09 10:46
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Извиняюсь, за элементарный вопрос!


А>Будет ли, в данном примере, при вызове функции printf(), утекать память. А если нет, то почему? Ведь в функцию main() возвращается указатель на временный объект. На выходе из функции printf() этого объекта уже нет!


Ничего утекать не будет, т.к. нигде нет динамических объектов — только автоматические. В функцию main возвращается невалидный указатель, который указывал на автоматический массив, который разрушился при выходе из MyPrint. Соответственно, имеет место быть неопределенное поведение.
Любите книгу — источник знаний (с) М.Горький
Re: указатель на временный объект
От: Кодт Россия  
Дата: 22.09.09 10:47
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Будет ли, в данном примере, при вызове функции printf(), утекать память. А если нет, то почему? Ведь в функцию main() возвращается указатель на временный объект. На выходе из функции printf() этого объекта уже нет!


Утечки здесь нет, поскольку динамическая память не задействована. А вот обращение к разрушенному объекту — есть.
При известной ловкости рук можно получить любой мусор на выходе. Но в твоём случае — повезло: вызов и исполнение printf не затёрло массив либо затёрло самый его хвостик, уже после концевого нуля.
... << RSDN@Home 1.2.0 alpha 4 rev. 1237>>
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.