web-dev-qa-db-fra.com

Renvoyer le pointeur d'une fonction

J'essaie de renvoyer le pointeur d'une fonction. Mais je reçois une faute de segmentation. Quelqu'un s'il vous plaît dites ce qui ne va pas avec le code

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

}
int *fun()
{
    int *point;
    *point=12;  
    return point;
}   
25
user567879

Allouez de la mémoire avant d'utiliser le pointeur. Si vous n'allouez pas de mémoire, *point = 12 est un comportement indéfini.

int *fun()
{
    int *point = malloc(sizeof *point); /* Mandatory. */
    *point=12;  
    return point;
}

De plus, votre printf est fausse. Vous devez déréférencer (*) le pointeur.

printf("%d", *ptr);
             ^
43
cnicutar

Bien que renvoyer un pointeur sur un objet local soit une mauvaise pratique, cela n’a pas causé le kaboom ici. Voici pourquoi vous avez une erreur de segmentation:

int *fun()
{
    int *point;
    *point=12;  <<<<<<  your program crashed here.
    return point;
}

Le pointeur local est hors de portée, mais le vrai problème est de déréférencer un pointeur qui n'a jamais été initialisé. Quelle est la valeur du point? Qui sait. Si la valeur ne correspond pas à un emplacement mémoire valide, vous obtiendrez un SEGFAULT. Si, par chance, il correspond à quelque chose de valide, vous venez de corrompre la mémoire en écrasant cet endroit avec votre affectation à 12.

Étant donné que le pointeur renvoyé a été utilisé immédiatement, vous pouvez dans ce cas renvoyer un pointeur local. Cependant, c'est une mauvaise pratique car si ce pointeur était réutilisé après un autre appel de fonction réutilisé cette mémoire dans la pile, le comportement du programme serait indéfini.

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

ou presque identique:

int *fun()
{
    int point;
    int *point_ptr;
    point_ptr = &point;
    *point_ptr = 12;
    return (point_ptr);
}

Une autre mauvaise pratique, mais plus sûre, consisterait à déclarer la valeur entière en tant que variable statique. Elle ne serait alors pas sur la pile et ne pourrait être utilisée par une autre fonction:

int *fun()
{
    static int point;
    int *point_ptr;
    point_ptr = &point;
    *point_ptr = 12;
    return (point_ptr);
}

ou 

int *fun()
{
    static int point;
    point = 12;
    return (&point);
}

Comme d'autres l'ont mentionné, la "bonne" méthode consiste à allouer de la mémoire sur le tas, via malloc.

17
invaliddata

Il n’alloue pas de mémoire lors de l’affectation de la valeur 12 au pointeur entier. Par conséquent, il se bloque, car il ne trouve pas de mémoire.

Vous pouvez essayer ceci:

#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);
}
0
Varun Chhangani