2010-12-09 21 views
1
#include <stdio.h> 
#include <stdlib.h> 

typedef struct data { 
    int a, b; 
} Data ; 

struct node { 
    Data info; 
    int priority; 
    struct node *link; 
}; 
typedef struct node* Node; 

void insert(Node header, int pr, Data el) { 
    Node cur = header; 
    Node tmp = malloc(sizeof(struct node)); 
    tmp->info = el; 
    tmp->priority = pr; 
    //descending <= 
    while (cur->link != NULL && pr >= cur->link->priority) 
     cur = cur->link; 
    tmp->link = cur->link; 
    cur->link = tmp; 
} 

Node delete(Node header) { 
    Node tmp; 
    if (header->link == NULL) 
     printf("Empty priority queue"); 
    else { 
     tmp = header->link; 
     header->link = tmp->link; 
     free(tmp); 
     return tmp; 
    } 
} 

void display(Node head) { 
    Node cur = head->link; 
    while (cur != NULL) { 
     printf("%d ", cur->priority); 
     cur = cur->link; 
    } 

} 

int main(int argc, const char *argv[]) 
{ 
    Data d; 
    Node tmp; 
    Node head = malloc(sizeof(struct node)); 
    head->link = NULL; 

    insert(head, 3, d); 

    insert(head, 2, d); 
    insert(head, 1, d); 
while (head->link != NULL) { 

    tmp = delete(head); 
    printf("%d ", tmp->priority); 
} 



    return 0; 
} 

La sortie de ceci est 1 2 3. mais en supprimant j'ai libéré la mémoire (libre (tmp)), puis renvoyé tmp. pourquoi est tmp encore l'impression dans la fonction principale. l'utilisation du compilateur gccne peut pas supprimer un emplacement de mémoire

+3

Pourquoi votre code accède-t-il à de la mémoire qui a déjà été 'libre()' 'éditée? Pourquoi la fonction 'delete()' renvoie-t-elle un pointeur vers la mémoire 'free()' 'ed en premier lieu? –

+0

En note, je ne suis pas sûr que j'aime particulièrement le typedef Node. Si quelqu'un ne regarde que votre définition de fonction, en un coup d'œil il semble que vous passez par valeur plutôt que par référence. Votre utilisation de typedef ici diminue la lisibilité. Juste mon avis si :) –

+0

@Demian: Je suis d'accord, mais mon prof à l'université utilisé pour faire la même chose. Je l'ai détesté, mais certaines personnes semblent aimer cacher des pointeurs dans typedefs. – Lucas

Répondre

7

delete/free ne met pas nécessairement à zéro la mémoire. Ils peuvent le marquer comme désalloué pour l'allocateur de mémoire. L'allocateur de mémoire est alors libre de l'allouer de nouveau dans un autre appel new/malloc. Le fait est que, dès que vous avez libéré le bloc de mémoire, vous ne devriez pas y accéder. C'est undefined comportement. Un comportement non défini signifie qu'il peut se bloquer, renvoyer des déchets, retourner une ancienne valeur, faire exploser votre ordinateur, become a skynet, ou toute autre chose, selon l'implémentation/la situation. Si vous souhaitez stocker des informations sensibles telles que des clés/mots de passe cryptographiques en mémoire aussi courtes que possible, vous devez remplir la mémoire avec autre chose avant de la libérer (par exemple en appelant SecureZeroMemory sous Windows).