2 votes

Type de retour pour cette fonction

Mon prototype de fonction est le suivant.

int * f4(int parm);

ma fonction ressemble à ceci

int * f4(int parm)
{
    return &parm + 1;  
}

Est-ce que mon type de retour est correct ? car il ne fait rien quand j'appelle la fonction.

c'est mon appel

int *pointer1;
pointer1 = f4(319);
cout << pointer1 << endl;

il renvoie l'adresse du pointeur, mais j'ai besoin qu'il renvoie la valeur, mais je n'arrive pas à le faire fonctionner.

en utilisant

cout << *pointer << endl;

n'affiche que 0

6voto

cnicutar Points 98451

Le problème, c'est l'objet parm est local à cette fonction. Il n'est pas légal de prendre et de conserver (c'est-à-dire de renvoyer) un pointeur sur cette fonction après la fin de l'invocation de la fonction.

En d'autres termes, parm "vit" tant que la fonction existe. Lorsque la fonction renvoie tous ses objets locaux (tels que parm ) "die".

En tant que crush dans les commentaires, pointer1 devient un pointeur invalide, également appelé affectueusement pointeur "ballant".

Montrez donc la bonne façon de faire !!!

Comme demandé, il y a plusieurs façons de procéder "correctement" :

  • Retour parm + 1 et modifier le type de retour de la fonction. Il ne semble pas que vous ayez vraiment besoin d'un pointeur

  • Prend le paramètre comme pointeur (ou référence, c'est du C++) et incrémente sa valeur pointée. Vous pouvez également le renvoyer si vous le souhaitez - le renvoi est valide puisqu'il provient de l'extérieur de la fonction

  • Ajouter un élément statique static int sparm; sparm = parm + 1 et renvoie un pointeur vers sparm . Cela rendra votre fonction non réentrante, mais cela fonctionnera : static les objets ne meurent pas à la fin de l'invocation de la fonction

  • Allouer (ugh ! ne pas le faire !) de la mémoire pour un pointeur et le renvoyer


En lisant le code plus attentivement, il est clair que le pointeur n'est jamais valide. Dès le départ, il dépasse d'un slot la mémoire disponible en tant que parm .

3voto

Carl Norum Points 114072

Renvoyer un pointeur vers une variable locale est une mauvaise nouvelle. parm est un paramètre de fonction, et est donc local à f4 . Vous renvoyez un mauvais pointeur à l'appelant et essayez ensuite de le déréférencer. Cela ne peut que se terminer par des larmes.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X