ΤΡΟΠΟΣ ΧΡΗΣΗΣ ΛΕΙΤΟΥΡΓΙΑΣ MALLOC ΣΤΟ C

How Use Malloc Function C



Το Malloc είναι μια ενσωματωμένη συνάρτηση που δηλώνεται στο αρχείο κεφαλίδας. Το Malloc είναι το σύντομο όνομα για «κατανομή μνήμης» και χρησιμοποιείται για τη δυναμική κατανομή ενός μόνο μεγάλου μπλοκ συνεχόμενης μνήμης σύμφωνα με το καθορισμένο μέγεθος. Υπάρχουν δύο τύποι κατανομής μνήμης στατικής και δυναμικής. Η στατική κατανομή της μνήμης γίνεται κατά τη διάρκεια της μεταγλώττισης και δεν αλλάζει κατά τη διάρκεια της εκτέλεσης. Η δυναμική κατανομή μνήμης είναι η κατανομή μνήμης κατά τη διάρκεια εκτέλεσης για αυτό. χρησιμοποιούμε malloc. Τώρα το σημείο είναι από πού προέρχεται αυτή η μνήμη, έτσι όλες οι δυναμικές απαιτήσεις στο C πληρούνται από τη μνήμη σωρού. Βασικά, η εφαρμογή/πρόγραμμα μας θα έχει 3 είδη μνήμης

  • Η μνήμη στοίβας είναι τοπική για κάθε μέθοδο και όταν επιστρέψει η μέθοδος, η στοίβα την καθαρίζει αυτόματα.
  • Η παγκόσμια περιοχή μνήμης κατανέμει τη μνήμη για όλες τις καθολικές μεταβλητές. Αυτή η περιοχή μνήμης δημιουργείται στην αρχή του προγράμματος και στο τέλος, καθαρίζει αυτόματα την περιοχή μνήμης.
  • Η μνήμη σωρού είναι πάντα εχθρός που πληροί όλες τις δυναμικές απαιτήσεις του προγράμματος/εφαρμογής. Κάθε φορά που πρόκειται να χρησιμοποιήσουμε τη συνάρτηση malloc, πρόκειται να δανειστεί κάποια μνήμη από τον σωρό και να μας δώσει τον δείκτη σε αυτήν.

Σύνταξη:







Η σύνταξη του malloc είναι (void*) malloc (size_t size). Έτσι η σύνταξη λέει ότι το malloc απαιτεί ένα μέγεθος, θα επιστρέψει τον δείκτη βασικά έναν κενό δείκτη και το μέγεθος t ορίζεται ως ένας μη υπογεγραμμένος ακέραιος αριθμός. Η συνάρτηση Malloc απλώς κατανέμει ένα μπλοκ μνήμης σύμφωνα με το μέγεθος που καθορίζεται στο σωρό, όπως μπορείτε να δείτε στη σύνταξη ότι το μέγεθος πρέπει να καθοριστεί και, με την επιτυχία, επιστρέφει έναν δείκτη που δείχνει το πρώτο byte της εκχωρούμενης μνήμης, ενώ η άλλη επιστρέφει NULL Το Έτσι, η δουλειά του malloc είναι να κατανέμει τη μνήμη στο χρόνο εκτέλεσης.



Γιατί κενός δείκτης:

Ο Malloc δεν έχει ιδέα για το τι δείχνει. σημαίνει απλώς ότι δεν γνωρίζει ποια δεδομένα θα αποθηκευτούν σε αυτήν τη θέση μνήμης. Απλώς κατανέμει τη μνήμη που ζητά ο χρήστης χωρίς να γνωρίζει τον τύπο των δεδομένων που θα αποθηκευτούν μέσα στη μνήμη. Αυτός είναι ο λόγος για τον οποίο επιστρέφει έναν δείκτη κενού.



Το Malloc απλώς κατανέμει τη μνήμη μετά από αυτό, είναι ευθύνη του χρήστη να πληκτρολογήσει σε έναν κατάλληλο τύπο, ώστε να μπορεί να χρησιμοποιηθεί σωστά στο πρόγραμμα. Ο κενός δείκτης είναι ένας δείκτης που μπορεί να δείξει οποιοδήποτε τύπο δεδομένων malloc επιστρέφει κενό δείκτη επειδή δεν γνωρίζει ποιος τύπος δεδομένων θα αποθηκευτεί μέσα σε αυτήν τη μνήμη.





Εδώ ζητάμε από το malloc να διαθέσει 6 bytes μνήμης τώρα, εάν ένα malloc επιτυχίας θα επιστρέψει ένα κενό δείκτη. Σε αυτήν την περίπτωση, πρέπει να το μεταδώσουμε με πληκτρολόγηση σε έναν δείκτη τύπου ακέραιου, επειδή θέλουμε να αποθηκεύσουμε έναν ακέραιο σε αυτήν τη μνήμη. Εδώ το malloc διαθέτει 6 byte μνήμης σε ένα σωρό και η διεύθυνση του πρώτου byte αποθηκεύεται στο δείκτη ptr.



Παράδειγμα προγράμματος:

Εδώ είναι ένα απλό παράδειγμα προγράμματος για να κατανοήσετε την έννοια του malloc με σωστό τρόπο.

Εδώ μπορείτε να δείτε με τη συνάρτηση printf που ζητώ από τον χρήστη να εισαγάγει τον αριθμό των ακεραίων. Έχουμε δηλώσει δύο μεταβλητές πάνω από το i και το n. Η μεταβλητή n είναι το μέρος όπου θα αποθηκεύσουμε τον αριθμό που έχει εισαγάγει ο χρήστης. Μετά από αυτό, έχουμε τη λειτουργία malloc. θέλουμε το malloc να κατανέμει το μέγεθος ισοδύναμο με το μέγεθος των n ακεραίων. Πολλαπλασιάζουμε το μέγεθος αν int με n? αυτό θα μας δώσει το μέγεθος των n ακεραίων. Μετά από αυτό, το malloc θα επιστρέψει έναν κενό δείκτη και τον πληκτρολογούμε σε έναν ακέραιο δείκτη και αποθηκεύουμε τη διεύθυνση εντός του δείκτη ptr. Η μετάδοση τύπου είναι σημαντική καθώς είναι μια καλή πρακτική.

Τώρα, εάν ο δείκτης περιέχει NULL, σημαίνει ότι η μνήμη δεν είναι διαθέσιμη. Έτσι, απλά θα βγούμε από το πρόγραμμα με την κατάσταση αποτυχίας εξόδου. Εάν αυτό δεν συμβαίνει, μπορούμε εύκολα να εκτελέσουμε το βρόχο.

Ο βρόχος θα τρέξει από το 0 στο n-1 και θα ζητάμε από τον χρήστη να εισάγει ακέραιο έναν έναν έναν κάθε φορά. Μέσα στη συνάρτηση scanf, υπάρχει ένα πράγμα γραμμένο ptr+i, όπως γνωρίζουμε ότι το ptr περιέχει τη διεύθυνση του πρώτου byte μνήμης. Ας πούμε ότι η διεύθυνση είναι 1000 εδώ, ισούται με μηδέν αρχικά, έτσι 1000+0 είναι 1000, οπότε εντός αυτής της διεύθυνσης ο πρώτος ακέραιος αριθμός μας θα αποθηκευτεί και μετά από αυτό όταν γίνω 1 έτσι 1000+1 που εσωτερικά έχει ερμηνευτεί ως (1000) +1 *4 αν υποθέσω ότι το μέγεθος του ακέραιου είναι 4 byte, και θα είναι ίσο με 1004, οπότε ο επόμενος ακέραιος θα αποθηκευτεί εντός 1004 θέσης. Και αυτό θα συνεχιστεί με αυτόν τον τρόπο οι διευθύνσεις είναι όπως 1000, 1004, 1008 και ούτω καθεξής. Δεν χρησιμοποιούμε ampersand πριν από το ptr+i επειδή το ptr μας δίνει ήδη τη διεύθυνση όταν γράφουμε ptr, το οποίο είναι απλώς ένας δείκτης και περιέχει τη διεύθυνση, όχι την τιμή, οπότε δεν υπάρχει απαίτηση να βάλουμε ampersand πριν από αυτό, και αυτή η έννοια πρέπει να είναι σαφής.

Εδώ σε αυτόν τον βρόχο, κάνουμε απλώς ένα πράγμα που εκτυπώνουμε όλους τους ακέραιους αριθμούς στην οθόνη. προφανώς, χρησιμοποιούμε το ptr+i, αλλά εδώ, σε αυτή την περίπτωση, το παραπέμπουμε επειδή το ptr+i αντιπροσωπεύει μια διεύθυνση, οπότε πρέπει να την παραπέμψουμε. Εάν είμαι ίσος με 0, θα είναι 1000 επειδή υποθέτουμε ότι η πρώτη διεύθυνση θα είναι 1000, οπότε την καταργούμε από την αναφορά. θα πάρουμε τον πρώτο ακέραιο τότε i ίσο με 1, και θα γίνει 1001 αλλά θα ερμηνευτεί ως 1004 αν το μέγεθος του ακέραιου είναι 4. Και πάλι. Το καταργούμε από την αναφορά, οπότε θα μας δώσει το 2ndακέραιος αριθμός. Με αυτόν τον τρόπο, όλα λειτουργούν.

Έτσι, αυτό είναι βασικά ένα απλό πρόγραμμα που ζητά από τους χρήστες να εισάγουν n ακέραιο αριθμό, και στη συνέχεια απλώς εμφανίζουμε αυτούς τους ακέραιους αριθμούς στην οθόνη. Μετά την εκτέλεση του προγράμματος, αυτό θα εμφανιστεί.

Αρχικά, ζητάμε από τον χρήστη να εισαγάγει τον αριθμό των ακεραίων και στη συνέχεια ο χρήστης εισάγει τους ακέραιους αριθμούς και απλώς τους εμφανίζουμε στην οθόνη.

Συμπέρασμα:

Δεν υπάρχει τίποτα λάθος στο παραπάνω πρόγραμμα όσο το συνεχίζουμε για πολύ καιρό εδώ δανειζόμαστε μνήμη από το σωρό, αλλά δεν επιστρέφουμε ποτέ τη μνήμη στο σωρό, συμβαίνει μόνο σε αυτήν την περίπτωση όπου το πρόγραμμα/η εφαρμογή έχει να τρέχει για μεγάλη διάρκεια, όπως 24 ώρες. Θα καλέσουν ξανά τη λειτουργία malloc, και πάλι αυτό σημαίνει ότι κάθε φορά που δανείζονται μνήμη από το σωρό και δεν επιστρέφουν ποτέ, αυτός είναι κακός προγραμματισμός, οπότε πρέπει να γράψουμε δωρεάν (τη διεύθυνση της μνήμης που πρέπει να απελευθερωθεί) πριν επιστρέψουμε. Έτσι, κάθε φορά που χρησιμοποιείτε το malloc free είναι σημαντικό. Έτσι, χρησιμοποιώντας το malloc, έχουμε διατηρήσει τη μνήμη και το malloc κατανέμει τη μνήμη τόσο μεγάλη όσο το ζητάτε.

Καλή δυναμική κατανομή μνήμης!