Подтвердить что ты не робот

Возвращающий указатель от функции

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

#include<stdio.h>
int *fun();
main()
{
    int *ptr;
    ptr=fun();
    printf("%d",*ptr);

}
int *fun()
{
    int *point;
    *point=12;  
    return point;
}   
4b9b3361

Ответ 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;
}