LINUX.ORG.RU

Знатокам стандарта Си

 


1

3

Есть ли undefined behavior в нижеприведённом коде (C99)?

#include <string.h>
#include <stdio.h>

char *
foo(char *s)
{
    strcpy(s, "hello");
    return s;
}

int
main()
{
    puts(foo((char [64]) {'\0'})); // будет ли этот char[64] жив после возврата foo?
}

будет ли этот char[64] жив после возврата foo?

Почему бы и нет? Будет жив до следующей }.

anonymous
()

Да, будет жив, т.к. стандарт устанавливает для compound literals такое же время жизни, как для локальных переменных, т.е. до конца блока.

Sorcerer ★★★★★
()

До конца блока доживёт.

будет ли этот char[64] жив после возврата foo?

А блок ограничен «}». Сами по себе compound literals введены в С99 (6.5.2.5 Compound literals (стр. 75-77).

Цитата оттуда:

The value of the compound literal is that of an unnamed object initialized by the initializer list. If the compound literal occurs outside the body of a function, the object has static storage duration; otherwise, it has automatic storage duration associated with the enclosing block.

Moisha_Liberman ★★
()

Кстати, а как автор будет рисовать классы, их иерархии ?! Ладно, простую функцию с аргументами нарисовать можно. Но вот что то сложное уже заебешься рисовать. Недаром человечество в своё время отошло от рисование рисунков, пиктограмм и перешло к алфавитной записи.

anonymous
()
Ответ на: комментарий от anonymous

Пардон, снесите, не туда запостил

anonymous
()
Ответ на: комментарий от anonymous

а как автор будет рисовать классы, их иерархии ?!

как в риновском Grasshopper.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.