2010-12-01 17 views
1

J'ai une structure suivante pour créer une liste chaînée, comment puis-je libérer la suite donnée?Libérer la mémoire de la structure en C

typedef struct linked_list { 
    struct linkedl_ist *number; 
    POINTER   house; 
} list; 


typedef list *LIST; 
typedef void pointer 

j'ai la liste suivante

LIST l1; 
l1 = some_function(pointer); 

Ces l1 est construit en utilisant certaines variables. C'est une structure de données de liste liée comme je l'ai mentionné. Comment puis-je libérer la mémoire allouée pour l1?

[EDIT]

l1 détient une mémoire de 8 octets.

+3

Cela dépend de la façon dont il est affecté. –

Répondre

3

l1 n'a pas besoin d'être libéré. C'est sur la pile. Revenez de la fonction dans laquelle vous êtes et elle disparaîtra automatiquement. La façon de libérer ce que l1 points est la même que la façon de libérer le reste des éléments de la liste: parcourir la liste (en utilisant ->number) et libérer chaque élément que vous allez.

LIST node = l1; 
LIST next; 
while (node != NULL) 
{ 
    next = node->number; 
    free(node); 
    node = next; 
} 
+3

Notez que 'l1' est une' liste * '. Ainsi, même si la variable pointeur n'a pas besoin d'être libérée, vous devez libérer la 'liste' qu'elle pointe vers. –

+0

@Matthew: Oups, raté le * dans le typedef. Merci. – nmichaels

2

Vous devez libérer les pointeurs de mémoire individuellement. Il n'y a pas vraiment de solution miracle ici, il faut boucler la liste chaînée et libérer les pointeurs pour chaque nœud, puis si la liste liée elle-même est dynamiquement allouée, il faut libérer cela.

Il est important de libérer les choses dans le bon ordre pour ne pas aboutir à dangling pointers. En d'autres termes, si vous avez un pointeur p qui pointe vers un autre pointeur p2, vous devez vous assurer de libérer p2 puis p. Vous ne voulez pas libérer p avant de libérer p2, car lorsque vous essayez de libérer p2 vous passez par un pointeur qui le fait (par exemple free (p-> p2) mais p est déjà libéré).

1

Je pense que vous devez libérer chaque élément de votre liste manuellement, à partir de l1, puis L1-> numéro, etc.

+0

Si vous le faites de cette façon, vous devrez être très, très prudent. Si vous libérez 'l1', puis essayez d'accéder' l1-> number', vous touchez la mémoire que vous avez déjà libérée. Ce qui est un grand non-non. Si vous voulez le faire de cette façon, vous devez vous assurer de tirer toutes les données dont vous avez besoin dans les locaux avant de libérer réellement l'élément. –

+0

C'est vrai. En fait, je travaille sur ces listes aussi, mais j'ai encore beaucoup de travail à faire (comme vous pouvez le voir) :) – BlackBear

+0

Je n'ai pas beaucoup d'expérience sur ces choses. Pouvez-vous s'il vous plaît me donner quelques liens utiles que vous lui référez ou probablement quelques exemples qui s'y rapportent. – thetna