Erevis Δημοσ. 4 Ιανουαρίου 2013 Δημοσ. 4 Ιανουαρίου 2013 Να ξέρεις ότι δεν έχουν σημασία τα μεγέθη που δίνεις για το αν θα πετύχει ή θα αποτύχει η realloc. Για να μην γίνομαι ανακριβής, ΕΧΟΥΝ αλλά όχι στο context που νομίζεις εσύ. H realloc συνήθως αποτυγχάνει λόγω κατακερματισμού του heap, δηλαδή δεν υπάρχουν αρκετές συνεχόμενες θέσεις μνήμης ελεύθερες στο heap ώστε να δεσμευθούν. Άλλος λόγος είναι το ότι έχεις εξαντλήσει το virtual address space σου, δηλαδή δεν υπάρχει άλλη ελεύθερη μνήμη . Επίσης, σου προτείνω να μην προγραμματίζεις με το σκεπτικό ότι κάτι σου κάνει για μια συγκεκριμένη περίπτωση, αλλά για το τι είναι καλό ΓΕΝΙΚΑ. Γιατί να μάθεις να κάνεις κάτι σωστά αργότερα, ενώ μπορείς να το κάνεις τώρα?
defacer Δημοσ. 4 Ιανουαρίου 2013 Δημοσ. 4 Ιανουαρίου 2013 Ένα θεματάκι είναι να μάθεις να διαβάζεις τη σύνταξη στη C...το παρακάτω θα σε βοηθήσει να ξερεις τι ακριβώς είναι καθε declaration http://c-faq.com/decl/spiral.anderson.html Site: http://www.cdecl.org
migf1 Δημοσ. 4 Ιανουαρίου 2013 Δημοσ. 4 Ιανουαρίου 2013 Δεν μας έχεις δώσεις κώδικα για να δούμε αν όντως το έλυσες το πρόβλημα, διάβασε όμως προσεχτικά αυτά που σου έχουν γράψει οι MitsakosGR & Erevis, καθώς και την τεκμηρίωση της realloc(). Η συνηθέστερη τακτική για την κληση τέτοιων συναρτήσεων είναι η 2η του Erevis, να επιστρέφεις NULL χωρίς να πειράζεις τον old αν αποτύχει η relloc()... int *biggerTable(int *old, int old_size, int new_size) { // sanity checks if ( !old ) { fputs( "*** internal error: invalid pointer\n", stderr ); return NULL; } if ( new_size < 1 || new_size <= old_size ) { fputs( "*** internal error: invalid new_size\n", stderr ); return NULL; } // το new_size ως ονομασία παραπέμπει σε εξαρχής σε bytes, // αν εννοούσες πλήθος στοιχείων, τότε consider να αλλάξεις το όνομα σε: new_elements_count // και να αντικατήσεις το 1ο όρισμα της realloc() που ακολουθεί με: new_elements_count * sizeof(int) int *try = realloc(old, new_size); if ( NULL == try ) { fputs( "*** internal error: realloc() failed\n", stderr ); return NULL; } return try; } Κατόπιν όταν καλείς την συνάρτησή σου μπορείς να ελέγχεις επιτόπου για failure, κάπως έτσι... int main( void ) { int *try = NULL; ... if ( NULL == (try=biggerTable(old, old_size, new_size)) ) return 1; old = try; ... return 0; } EDIT: Ξέχασα, αν θες να επιστρέφει silently η συνάρτησή σου σε τυχόν αποτυχία της realloc(), μπορείς να κάνεις απευθείας... return realloc(old, newsize); αμέσως μετά τα sanity checks, και να μεταφέρεις την loud επισήμανση στο σώμα της if, στην main(), που ελέγχει αν αποτυγχάνει η συνάρτηση. Κάτι τέτοιο είναι inconsistant όμως (εκτός αν την κάνεις silent και στην περίπτωση που αποτύχουν τα sanity checks... αλλά τότε δεν θα έχει λόγο ύπαρξης η συνάρτηση, αφού ούτε λίγο ούτε πολύ θα ισοδυναμεί με μια απευθείας κλήση της realloc() ).
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα