Δημοσιεύτηκε: 08 Ιούλ 2011, 18:38
από Star_Light
migf1 έγραψε:Καλημέρα παιδιά, 1000 ευχαριστώ για τα καλά σας λόγια. Είναι χαρά μου να βοηθάω όπου μπορώ.

Φίλε Strarlight, ο κώδικάς σου έχει προβληματάκια:

.......

4. Μετά την απελευθέρωση των κόμβων έχεις μια συνθήκη if-else προκειμένου να ελέγξεις αν πέτυχε η απελευθέρωση μνήμης....

Κώδικας: Επιλογή όλων

if (head->id) // <-- λάθος
printf("H free dn ekane kala tin douleia tis \n");
else
printf("H mnimi eleutherwthike!");

Εδώ υπάρχουν 2 προβλήματα, το σοβαρότερο εκ των οποίων είναι πως και πάλι προσπαθείς να χρησιμοποιήσεις έναν κατεστραμμένο κόμβο (από το προηγούμενο free) και συγκεκριμένα προσπαθείς να χρησιμοποιήσεις το πεδίο: id του κατεστραμμένου κόμβου (head->id). Το επόμενο πρόβλημα είναι πως το πεδίο id είναι τύπου int, οπότε ακόμα και αν ο κόμβος head υπήρχε, η συνθήκη: if ( head->id ) συγκρίνει την int τιμή του id με το 0 για να αποφασίσει αν απελευθερώθηκε ή όχι η μνήμη;

Υποθέτω πως εννοούσες: if (head == NULL). Πάντως δεν είναι καλή ιδέα να συγκρίνεις τον δείκτη ενός κόμβου που έχεις ήδη καταστρέψει με το free(). Προφανώς ούτε να τον χρησιμοποιείς. Για να τον ξαναχρησιμοποιήσει ως κόμβο θα πρέπει να κάνεις εκ νέου malloc()/calloc().

Να πω και κάτι τελευταίο, που έχω την εντύπωση πως δεν έχεις ξεκαθαρίσει στο μυαλό σου. Μπορεί να κάνω και λάθος, αλλά θα το πω καλού-κακού μιας και το φόρουμ το διαβάζει πολύς κόσμος.

Έχει να κάνει με τον συμβολισμό -> για πρόσβαση στα πεδία μιας μεταβλητής που είναι τύπου struct. Ο κανονικός συμβολισμός για να αναφερθούμε σε ένα πεδίο μιας μεταβλητής τύπου struct είναι η τελεία (.).



Οπα ψεμματα. Μου το ειχες τονισει!

Π.Σ Ναι μπερδευτηκα - απο κεκτιμενη ταχυτητα τα free φυσικα και δεν ειναι περιττα!!!!