retour d'une variable locale à partir d'une fonction en C [dupliquer]

cette question a déjà une réponse ici:

#include <stdio.h>

int foo1(void)
{
    int p;
    p = 99;
    return p;
}

char *foo2(void)
{
    char buffer[] = "test_123";
    return buffer;
}

int *foo3(void)
{
    int t[3] = {1,2,3};
    return t;
}

int main(void)
{
    int *p;
    char *s;

    printf("foo1: %dn", foo1());
    printf("foo2: %sn", foo2());
    printf("foo3: %d, %d, %dn", p[0], p[1], p[2]);
    return 0;
}

quand je le compile avec gcc -ansi -pedantic -W -Wall le compilateur émet des messages d'avertissement pour foo2 () et foo3 ():

warning: function returns address of local variable

j'ai pensé qu'il n'est pas permis de retourner une variable locale, mais foo1() fonctionne très bien et il semble qu'il y ait une énorme différence entre retourner pointeur à un objet local et l'objet lui-même.

Quelqu'un pourrait-il nous éclairer sur cette question? Merci à l'avance!

32
demandé sur John Kugelman 2011-01-28 05:43:55

4 réponses

le problème ici est que lorsque vous créez la variable locale, elle est attribuée sur la pile et n'est donc pas disponible une fois que la fonction a terminé l'exécution (l'implémentation varie ici). La meilleure façon serait d'utiliser malloc() pour réserver la mémoire non locale. le danger ici est que vous devez désallouer ( free() ) tout ce que vous avez alloué en utilisant malloc() , et si vous oubliez, vous créez une fuite de mémoire.

22
répondu kelloti 2011-01-28 03:17:59

Pour foo1() , vous revenez à un copie de la variable locale, et non pas la variable locale elle-même.

pour les autres fonctions, vous retournez une copie d'un pointeur à une variable locale. Cependant, cette variable locale est désactivée lorsque la fonction est terminée, donc vous finissez avec des problèmes désagréables si vous essayez de la référencer par la suite.

16
répondu Cam 2011-01-28 03:16:44

N'importe quelle variable a de l'espace dans la mémoire. Un pointeur indique cet espace. L'espace occupé par les variables locales est désalloué lorsque l'appel de fonction retourne, ce qui signifie qu'il peut être réutilisé et le sera pour d'autres choses. En conséquence, les références à cet espace va finir pointant vers quelque chose de complètement différent. Les tableaux en C sont implémentées comme des pointeurs, cela vents d'application. Et les tableaux constants déclarés dans une fonction comptent aussi comme étant locaux.

si vous voulez utiliser un tableau ou un autre pointeur au-delà de la portée de la fonction dans laquelle il est créé, vous devez utiliser malloc pour réserver l'espace pour lui. L'espace réservé à l'aide de malloc ne sera pas réattribué ou réutilisé tant qu'il n'est pas explicitement libéré par appel gratuit.

5
répondu Keith Irwin 2011-01-28 02:46:11

Oui vous retournez un tableau, qui est en fait un pointeur dans les coulisses, à l'adresse de l'emplacement de la mémoire où le contenu de la variable que vous avez initialisée est stocké. Donc il vous avertit qu'il pourrait ne pas être tout à fait aussi utile de retourner un tel résultat, quand vous pourriez vraiment signifier une des valeurs du tableau à la place.

0
répondu evandrix 2011-01-28 02:49:12