2017-09-27 2 views
0

J'implémente un programme de liste chaînée en C et la fonction create_node donne un avertissement: function retourne l'adresse de la variable locale. J'ai lu sur l'utilisation de malloc, mais je voudrais comprendre ce que le problème et la solution d'origine seraient sans elle. Merci.La fonction de liste liée renvoie l'adresse de la variable locale

struct list_node_s* Create_node(int val, struct list_node_s* node_p) { 
    struct list_node_s temp; 

    temp.data = val; 
    temp.next_p = node_p; 
    return &temp; 
} /* Create_node */ 
+1

Related https://stackoverflow.com/q/4824342/694576 s'il ne s'agit pas d'un doublon. – alk

+0

Il est quelque chose qui est très difficile à expliquer sur une jambe, mais je vais essayer d'être simpale Le problème est lorsque vous créez une variable sans ** malloc ** - Dans les coulisses, vous mettez la variable sur la pile - Segment de la mémoire qui sauvent quelque chose sur votre segment de code actuel. – Bizzu

+0

Lorsque vous sautez pour fonctionner, vous ajoutez des choses à votre pile à partir d'un certain point et quand vous avez fini (retour de la fonction annuler ou annuler la fonction vide) vous libérez toutes les choses que vous enregistrez du point d'entrée. Cela veut dire - dans votre code spécifique, vous essayez de renvoyer l'adresse de quelque chose que vous enregistrez sur la pile, mais lorsque vous revenez, vous libérez la pile - vous essayez de renvoyer ce que vous avez "libéré". . – Bizzu

Répondre

0

Le problème est que votre variable temp est une variable locale . Il a une portée de fonction donc il n'existe que tant que votre programme est dans la fonction. Ceci est généralement implémenté avec une pile .

Vous devez utiliser malloc pour obtenir de la mémoire à partir du tas d'où proviennent toutes les allocations dynamiques. De cette façon, la liste et ses nœuds existeront jusqu'à ce que vous les détruisiez explicitement avec free.

La seule autre solution, que je ne recommande pas, est de construire votre liste en utilisant des appels de fonction récursifs. Et aussi longtemps que vous utilisez la liste ne jamais retourner.

J'ai vu cela fait une fois. C'était hideux. Mais possible.