Возвращающий указатель от функции
Я пытаюсь вернуть указатель из функции. Но я получаю ошибку сегментации. Кто-то, пожалуйста, сообщите, что не так с кодом
#include<stdio.h>
int *fun();
main()
{
int *ptr;
ptr=fun();
printf("%d",*ptr);
}
int *fun()
{
int *point;
*point=12;
return point;
}
Ответы
Ответ 1
Выделите память перед использованием указателя. Если вы не выделяете память *point = 12
, это поведение undefined.
int *fun()
{
int *point = malloc(sizeof *point); /* Mandatory. */
*point=12;
return point;
}
Также ваш printf
ошибочен. Вам нужно разыменовать указатель (*
).
printf("%d", *ptr);
^
Ответ 2
Хотя возврат указателя к локальному объекту является плохой практикой, он не вызывает здесь kaboom. Вот почему у вас есть segfault:
int *fun()
{
int *point;
*point=12; <<<<<< your program crashed here.
return point;
}
Локальный указатель выходит за пределы области видимости, но реальная проблема заключается в разыменовании указателя, который никогда не инициализировался. Какова ценность точки? Кто знает. Если значение не сопоставимо с действительной ячейкой памяти, вы получите SEGFAULT. Если по счастью он сопоставлен с чем-то действительным, то вы просто испорчены память, переписав это место с вашим назначением на 12.
Так как возвращаемый указатель был немедленно использован, в этом случае вы могли бы уйти с возвратом локального указателя. Тем не менее, это неверная практика, потому что если этот указатель был повторно использован после вызова другой функции, которая повторно использовала эту память в стеке, поведение программы было бы undefined.
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.
Ответ 3
Он не выделяет память при присвоении значения 12 целочисленному указателю. Поэтому он падает, потому что он не находит никакой памяти.
Вы можете попробовать следующее:
#include<stdio.h>
#include<stdlib.h>
int *fun();
int main()
{
int *ptr;
ptr=fun();
printf("\n\t\t%d\n",*ptr);
}
int *fun()
{
int ptr;
ptr=12;
return(&ptr);
}
Ответ 4
Насколько я знаю, использование ключевого слова new, относительно то же, что и malloc (sizeof identifier). В приведенном ниже коде показано, как использовать ключевое слово new.
void main(void){
int* test;
test = tester();
printf("%d",*test);
system("pause");
return;
}
int* tester(void){
int *retMe;
retMe = new int;//<----Here retMe is getting malloc for integer type
*retMe = 12;<---- Initializes retMe... Note * dereferences retMe
return retMe;
}