Несмотря на то, что возвращение указателя на локальный объект является плохой практикой, здесь он не вызывает kaboom. Вот почему у вас есть ошибка:
int *fun()
{
int *point;
*point=12; <<<<<< your program crashed here.
return point;
}
Локальный указатель выходит из области видимости, но реальная проблема заключается в разыменовании указателя, который никогда не был инициализирован. Какова стоимость балла? Кто знает. Если значение не сопоставлено с действительной ячейкой памяти, вы получите SEGFAULT. Если по счастливой случайности оно сопоставлено с чем-то действительным, то вы просто повредили память, переписав это место своим назначением на 12.
Поскольку возвращенный указатель был немедленно использован, в этом случае вы можете избежать возврата локального указателя. Однако это плохая практика, потому что если этот указатель был повторно использован после того, как другой вызов функции повторно использовал эту память в стеке, поведение программы было бы неопределенным.
int *fun()
{
int point;
point = 12;
return (&point);
}
или почти идентично:
int *fun()
{
int point;
int *point_ptr;
point_ptr = &point;
*point_ptr = 12;
return (point_ptr);
}
Еще одна плохая практика, но более безопасный метод - объявлять целочисленное значение как статическую переменную, и тогда она не будет в стеке и будет безопасна для использования другой функцией:
int *fun()
{
static int point;
int *point_ptr;
point_ptr = &point;
*point_ptr = 12;
return (point_ptr);
}
или
int *fun()
{
static int point;
point = 12;
return (&point);
}
Как уже упоминали другие, "правильный" способ сделать это - выделить память в куче через malloc.