2016-09-29 2 views
-1

J'ai écrit une fonction pour ajouter des nœuds créés dynamiquement à la fin d'une liste chaînée, en utilisant malloc.Et puis sur la dernière ligne de fonction, j'ai essayé de libérer l'espace mémoire pour la température du pointeur.en utilisant la fonction free() dans C

addnodelast(int data){ 
struct node* temp =(struct node*)malloc(sizeof(struct node)); 
temp->data=data; 
temp->link=NULL; 
struct node*p=head; 
while(p->link!=NULL) 
{ 
    p=p->link; 
} 
p->link=temp; 
free(temp); 

}

Mais sur l'exécution, je ne suis pas en mesure d'imprimer la liste car il est infiniment values.But aléatoire d'impression quand je supprimer/commenter la dernière sans ligne (température), cela fonctionne tout va bien .

+1

Je ne vois aucune impression dans ce code. De plus, je ne vois rien de significatif ici. –

+2

C'est une erreur logique de libérer le nœud ajouté. – jxh

+0

Vous appelez 'free()' prématurément. –

Répondre

2

Vous avez alloué de l'espace pour un nouveau noeud & ajouté à la liste; temp pointe vers ce noeud. Lorsque vous appelez free(temp), vous ne libérez pas l'espace pris par temp, mais ce qu'il pointe à: le nœud que vous venez d'ajouter à la liste.

+0

Oui, après avoir utilisé free (temp), temp ne pointera pas sur le noeud nouvellement créé.Mais cela ne devrait pas affecter la liste car j'ai déjà enregistré l'adresse du noeud (p-> link = temp). Donc, pourquoi mon fonction d'impression ne fonctionne pas sur l'utilisation gratuite? –

+0

Qu'est-ce que vous pensez que «libre» fait? –

+1

@KrishnaBagaria parce que la mémoire ne vous appartient plus après 'free()'. Il peut être écrasé par un autre processus. –

1

Après p-> link = temp, la valeur de la variable temp vit également dans p-> link.

Si cette adresse est libérée, alors p-> link référencera la mémoire désallouée, qui sera réutilisée à d'autres fins, corrompant les données.

2

Je ne suis pas en mesure d'imprimer la liste car il est infiniment impression aléatoire values.But quand je supprimer/commentaire la dernière ligne libre (temp), il fonctionne tout va bien.

Ce n'est pas vraiment surprenant. Lorsque vous free() le nœud que vous avez ajouté à la liste, puis essayez d'imprimer/accéder, vous appelez undefined behaviour parce que le nœud (sa mémoire a été désaffectée) ne plus "exister" en ce qui concerne votre programme. Donc, vous tous ces nœuds deviennent dangling pointers. Par conséquent, vous ne devez pas libérer() les nœuds tant que vous n'avez plus besoin d'accéder à la liste.