Δημοσιεύτηκε: 08 Ιούλ 2011, 18:15
migf1 έγραψε:Star_Light έγραψε:
[snip]
εκανα αυτες τις αλλαγες... ρε συ εμενα το προγραμμα τωρα μου τρεχει κανονικα... εμφανιζει 12 (κολλημενα βεβαια ακομη και αν βαζω \n \t)
μπορει να κουραζεσαι να λες τα ιδια και τα ιδια αλλα πως θα δω αν ο δεικτης εχει ελευθερωθει??? δεν πρεπει να τον συγκρινω με NULL??? Μετα την free να δω αν εκανε καλα την δουλεια της ??? ενα αυτο.
Όπως σου είπα κι εγώ αλλά όπως γράφει και η τεκμηρίωση της free() που βρήκες και μου έδειξες, μετά το free() ο δείκτης ΔΕΝ ισούται με NULL, δείχνει σε έναν κατεστραμμένο κόμβο, που εν πολλοίς σημαίνει πως είναι undefined.
Δεν μπορείς να ελέγξεις που δείχνει ο δείκτης μετά το free(). Η γλώσσα όμως σου εγγυάται πως η free() απελευθερώνει ότι της είπες να απελευθερώσει (αν της δώσεις να απελευθερώσει κάτι που δεν υπάρχει, απλά δεν κάνει τίποτα).έγραψε:Μετα που μου λες οτι χανω την επαφη με το loop το καταλαβαινω και εχεις δικιο αλλα θα ηθελα να το φτιαξω απλα να καλει την συναρτηση... τελοςπαντων το εκανα με for και ξεμπερδεψα αν και ο δικος σου τροπος ειναι σιγουρα πιο επαγγελματικος....
Απο την αλλη...... βασικα οκ τωρα καταλαβα
ολη την ζημια την εκανε το head=head->next τωρα με το for πιστευω ειναι ενταξει... η δικη σου γνωμη ποια ειναι?????
Π.Σ Αν αντι για την for εβαζα σκετο while με τον head μεσα μετα απο κατω θα επρεπε καπως να τον μετακινω αλλα μου λες πως χανεται η επαφη με την λιστα..... Δεν κοιταξα αλλο τον δικο σου κωδικα γιατι θελω να καταλαβω μονος μου.... απλα διαβαζω αυτα που γραφεις.
Ευχαριστω
Δεν κάνει τη διαφορά το νέο for που έβαλες, αλλά το ότι το τύπωμα της λίστας τώρα το κάνεις καλώντας τη συνάρτηση: list_print (που σημαίνει πως επειδή της περνάς το head by value μετακινεί μέσα της ένα αντίγραφο του head και όχι το αυθεντικό που έχουμε ορίσει στη main() ). Πριν έβαζες μέσα στο for το αυθεντικό head για να τυπώσεις τη λίστα και άρα στο τέλος του for ο αυθεντικός head είχε μετακινηθεί στο τέλος της λίστας (και ήταν προφανώς NULL).
Οκ κατάλαβα. Δηλαδη μου λες πως ουσιαστικα ολο αυτο το κομμάτι κώδικα είναι περιττό
- Κώδικας: Επιλογή όλων
}
free(one->next); /*Etsi einai to swsto kai oxi opws to eixa anapoda gt einai sfalma */
free(head->next); /* epeidi to head itan hdh katestrameno dn borousa meta na dwsw px */
free(head); /* free(head->next) */
if(head==NULL)
printf("H free dn ekane kala tin douleia tis \n");
else
printf("H mnimi eleutherwthike!");
συνέχισα να το βάζω επειδη και στον προηγούμενο κώδικα που μου είχες διορθώσει (ξερεις εκει που μου διορθωσες την σειρα που εβαζα τα free) δεν ειχες πει κατι για αυτο οποτε θεωρησα πως ειναι ενταξει.... αλλα οκ θα το βγαλω μιας και μου το εξηγησες.
Δηλαδη δεν υπαρχει καποιος τροπος να κάνουμε έλεγχο αν η free απελευθέρωσε κάποιον κόμβο???
Και εχω και μια απορια... μου πεταει warning για implicit declaration στην list_print() και γενικα
- Κώδικας: Επιλογή όλων
listes_me_sunarthseis.c:60: warning: conflicting types for ‘list_print’
εδω δεν καταλαβαινω... μπορουμε να επιστρεφουμε void και το όρισμα να ειναι μεσα σε int ας πουμε??? η παράμετροι....
EDIT : Οκ έφταιγε οτι δεν την είχα δηλώσει κατω απο τα headers και πριν την main εφυγαν τα warnings .