Star_Light Δημοσ. 4 Ιουλίου 2013 Δημοσ. 4 Ιουλίου 2013 Καλησπέρα έχω μια απορια δεν ειμαι σιγουρος αν έχω καταλαβει τι θέλει να πει το απόσπασμα : The C standard stops short of specifying exactly how realloc works.Still we expect it to be reasonably efficient.When asked to reduce the size of a memory block, realloc should shrink the block "in place" without moving the data stored in the block.By the same token, realloc should always attempt to expand a memory block without moving it.If it is unable to enlarge the block(because the bytes following the block are already in use for some other purpose), realloc will allocate a new block elsewhere, then copy the contents of the old block into the new one. Με άλλα λογια η realloc συρικνώνει ή μεγαλώνει το μπλοκ χωρις να το μετακινήσει απο την θέση που ηδη βρισκεται? Once the realloc has returned, be sure to update all pointers to the memory block since it is possible that realloc has moved the block elsewhere Δηλαδη εγω τι κανω εδω? δεν εχω καταλαβει. και τέλος τι εννοει με αυτο? Although realloc doesn't require that pointer (ptr) point to memory that is being used as an array in practice it usually does... Ευχαριστω εκ των προτερων οποιον μπει στον κοπο να ασχοληθεί.
albNik Δημοσ. 4 Ιουλίου 2013 Δημοσ. 4 Ιουλίου 2013 Οταν πρεπει να μεγαλώσει κοιταει εαν διπλα του εχει ελευθερο χωρο. Αν δεν εχει πιανει ενα νεο χωρο αλλου αντιγραφοντας και τα παλια bytes. Αν εσυ ειχες δεικτες προς το παλοιο bloc πρεπει να τους ενημερώσεις στο νεο.
Star_Light Δημοσ. 4 Ιουλίου 2013 Μέλος Δημοσ. 4 Ιουλίου 2013 Οταν πρεπει να μεγαλώσει κοιταει εαν διπλα του εχει ελευθερο χωρο. Αν δεν εχει πιανει ενα νεο χωρο αλλου αντιγραφοντας και τα παλια bytes. Αν εσυ ειχες δεικτες προς το παλοιο bloc πρεπει να τους ενημερώσεις στο νεο. Α μαλιστα αν δηλαδη δεν μπορει να δωσει το λειτουργικο συστημα η ο μεταγλωτιστης? τον διπλανο χωρο φροντιζει να παει καπου αλλου. Να μην ρωτησω πως θα τους ενημερωσω γιατι θελω να πιστευω οτι θα εχει καποιο παραδειγμα πιο κατω το βιβλιο.... η συρικνωση πως γινεται???? και με την τελευταια προταση τι θελει να πει?
albNik Δημοσ. 4 Ιουλίου 2013 Δημοσ. 4 Ιουλίου 2013 Η συρικνωση ειναι πιο απλη, απλα οριζει "ελευθερα" τα bytes που περίσσεψαν. Αν κάνεις p1=malloc(40 MB) p2=malloc(50 MB) p3=realloc(p1, 70 MB) Αν μετα τα πρωτα 40ΜΒ δεν εχει χώρο για αλλα 30 ΜΒ (επειδη υπαρχουν τα 50ΜΒ του p2) μπορει να αντιγράψει τα 40 και να δηλωσει 40+30 σε ενα νεο χώρο. Ο p1 θα δειχνει στον παλιο χωρο (που ειναι λάθος). 1
imitheos Δημοσ. 4 Ιουλίου 2013 Δημοσ. 4 Ιουλίου 2013 Καλησπέρα έχω μια απορια δεν ειμαι σιγουρος αν έχω καταλαβει τι θέλει να πει το απόσπασμα : The C standard stops short of specifying exactly how realloc works.Still we expect it to be reasonably efficient.When asked to reduce the size of a memory block, realloc should shrink the block "in place" without moving the data stored in the block.By the same token, realloc should always attempt to expand a memory block without moving it.If it is unable to enlarge the block(because the bytes following the block are already in use for some other purpose), realloc will allocate a new block elsewhere, then copy the contents of the old block into the new one. Με άλλα λογια η realloc συρικνώνει ή μεγαλώνει το μπλοκ χωρις να το μετακινήσει απο την θέση που ηδη βρισκεται? Ένας από τους πολλούς τρόπους που μπορεί να δουλεύει ο allocator είναι με ένα σύνολο περιοχών από διάφορα μεγέθη. Έτσι όταν εσύ ζητάς ένα ποσό σου δίνει την αμέσως μεγαλύτερη περιοχή χωρίς όμως να μπαίνει στο κόπο να την σπάσει. Έτσι αν ζητήσεις 100bytes και έχει μια περιοχή 180bytes μπορεί να στην δώσει όπως είναι. Αν μετά κάνεις realloc και ζητήσεις 150, τότε δεν χρειάζεται να γίνει τίποτα (πέρα από εσωτερικό housekeeping του allocator) μια και η περιοχή έχει αρκετό μέγεθος. Για αυτό το λόγο δεν αλλάζει ο δείκτης. Αν όμως η περιοχή δεν είναι αρκετή πρέπει να σου δώσει μια άλλη και να αντιγράψει όλα τα περιεχόμενα εκεί. Once the realloc has returned, be sure to update all pointers to the memory block since it is possible that realloc has moved the block elsewhere Δηλαδη εγω τι κανω εδω? δεν εχω καταλαβει. #include <stdio.h> #include <stdlib.h> int main(void) { char *p1, *p2, *p3, *p4; p1 = malloc(50); p2 = realloc(p1, 60); p3 = malloc(50); p4 = realloc(p3, 500000); printf("p1 = %p - p2=%p\n", (void *)p1, (void *)p2); printf("p3 = %p - p4=%p\n", (void *)p3, (void *)p4); return 0; } Έξοδος: p1 = 0xc008 - p2=0xc008 p3 = 0xc048 - p4=0x1f008 Στην πρώτη περίπτωση η περιοχή που ζητήθηκε δεν ήταν ακριβώς 50 bytes αλλά κάτι περισσότερο το οποίο επαρκούσε για 60 και έτσι οι δείκτες p1, p2 έχουν ίδια τιμή. Στην δεύτερη περίπτωση η περιοχή δεν έφτανε για 500K οπότε έπρεπε να εκχωρηθεί μια νέα περιοχή για αυτό και οι δείκτες έχουν άλλη τιμή. Δηλαδή το realloc έδωσε την περιοχή 1f008 και αντέγραψε τα 50 bytes της c048 εκεί. 1
Star_Light Δημοσ. 4 Ιουλίου 2013 Μέλος Δημοσ. 4 Ιουλίου 2013 Ωραίο!!! Για ποιο λογο κάνεις cast σε generic δεικτη? Μηπως επειδη δεν ξέρεις τι ειδους δεδομένα ειναι αποθηκευμένα σε αυτη την τοποθεσια μνήμης? υγ Ναι τωρα ξανακοιταξα τα προτυπα τους ... οι συναρτησεις αυτες επιστρέφουν ολες void * (malloc , calloc , realloc) αλλα δοκιμασα να βγαλω το cast και επισης δουλεουν μια χαρα επειδη γινεται καποιο implicit conversion απο void * σε char * . Λογικα το cast που κανεις εσυ ειναι θεμα στυλ δεν ειναι υποχρεωτικο.Οταν εκτελειται η αναθεση γινεται κανονικα η μετατροπη του επιστρεφομενου τυπου της malloc ή καποιας άλλης ετσι δεν ειναι?
imitheos Δημοσ. 4 Ιουλίου 2013 Δημοσ. 4 Ιουλίου 2013 Ωραίο!!! Για ποιο λογο κάνεις cast σε generic δεικτη? Μηπως επειδη δεν ξέρεις τι ειδους δεδομένα ειναι αποθηκευμένα σε αυτη την τοποθεσια μνήμης? υγ Ναι τωρα ξανακοιταξα τα προτυπα τους ... οι συναρτησεις αυτες επιστρέφουν ολες void * (malloc , calloc , realloc) αλλα δοκιμασα να βγαλω το cast και επισης δουλεουν μια χαρα επειδη γινεται καποιο implicit conversion απο void * σε char * . Λογικα το cast που κανεις εσυ ειναι θεμα στυλ δεν ειναι υποχρεωτικο.Οταν εκτελειται η αναθεση γινεται κανονικα η μετατροπη του επιστρεφομενου τυπου της malloc ή καποιας άλλης ετσι δεν ειναι? Στη γραμμή της malloc όντως γίνεται μετατροπή από void σε ό,τι τύπο έχει η μεταβλητή αλλά εγώ δεν έβαλα cast στη γραμμή της malloc. Τι σχέση τι επιστρέφουν οι συναρτήσεις *alloc με το δικό μου cast ? Στην printf θεωρητικά δεν είναι καθόλου θέμα στυλ και είναι υποχρεωτικό. p The void * pointer argument is printed in hexadecimal (as if by %#x or %#lx). p The argument shall be a pointer to void. The value of the pointer is converted to a sequence of printing characters, in an implementation-defined manner. Πρακτικά στις περισσότερες περιπτώσεις η υλοποίηση των *printf συναρτήσεων θα εμφανίσουν σωστά το δείκτη και χωρίς το cast απλά το έβαλα από συνήθεια.
Star_Light Δημοσ. 4 Ιουλίου 2013 Μέλος Δημοσ. 4 Ιουλίου 2013 Ε αυτο σου ειπα και εγω οτι ειναι θέμα στύλ και δεν χρειάζεται.Η αληθεια ειναι οτι δεν έχω δει αλλη φορα παράδειγμα με void * δεικτη σε printf οποτε μπορει να μην εχει σχεση αυτο που λεω απλα βασιστηκα σε αυτο που λεει ο Κινγκ για την επιστρεφομενη τιμή της malloc που την εκχωρεις στον δεικτη.
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα