Πριν καταλάβουμε τις λειτουργίες malloc () και calloc () πρώτα ας καταλάβουμε την έννοια της δυναμικής κατανομής μνήμης. Η κατανομή μνήμης είναι η διαδικασία εκχώρησης της μνήμης του υπολογιστή για την εκτέλεση προγραμμάτων και διαδικασιών. Χρησιμοποιούμε τεχνικές δυναμικής κατανομής, όταν δεν είναι γνωστό πόσος χώρος μνήμης απαιτείται για το πρόγραμμα και τη διαδικασία.
Η δυναμική κατανομή της μνήμης προκύπτει λόγω των προβλημάτων που σχετίζονται με την κατανομή στατικής μνήμης, όπως εάν αποθηκευτούν λιγότερα στοιχεία, τότε η υπόλοιπη μνήμη σπαταλάται άσκοπα. Επομένως, ξεπερνά τα προβλήματα της κατανομής της στατικής μνήμης όπου η μνήμη κατανέμεται μόνο όταν απαιτείται.
Συγκριτικό διάγραμμα
Βάση σύγκρισης | malloc () | calloc () |
---|---|---|
Αριθμός μπλοκ | Αναθέτει ένα μοναδικό μπλοκ της απαιτούμενης μνήμης. | Αναθέτει πολλαπλά τεμάχια της ζητούμενης μνήμης. |
Σύνταξη | κενό * malloc (size_t μέγεθος); | κενό * calloc (size_t num, size_t μέγεθος); |
Αρχικοποίηση | το malloc () δεν εκκαθαρίζει και αρχικοποιεί την εκχωρημένη μνήμη. | Η κατανεμημένη μνήμη αρχικοποιείται στο μηδέν χρησιμοποιώντας το calloc (). |
Τρόπος Κατανομής | Η συνάρτηση malloc () διαθέτει μνήμη μεγέθους μεγέθους από τον σωρό. | η συνάρτηση calloc () διαθέτει μνήμη του οποίου το μέγεθος είναι ίσο με το μέγεθος num *. |
Ταχύτητα | Γρήγορα | Συγκριτικά αργή. |
Ορισμός του malloc ()
Η συνάρτηση malloc εκχωρεί ένα μπλοκ μνήμης σε byte . Ο χρήστης θα πρέπει να δώσει ρητά το μέγεθος του μπλοκ που απαιτεί για τη χρήση του.
Μέσω του προγράμματος λειτουργίας malloc ζητά RAM του συστήματος για την κατανομή της μνήμης, αν η αίτηση παραδοθεί (δηλ., Η λειτουργία malloc λέει ότι είναι επιτυχής στην εκχώρηση μνήμης), επιστρέφει έναν δείκτη στο πρώτο μπλοκ μνήμης. Επαναφέρει τον άκυρο τύπο δείκτη, δηλαδή μπορεί να οριστεί οποιοσδήποτε τύπος δείκτη.
Αν και, επιστρέφει ένα NULL, αν οι λειτουργίες malloc δεν είναι σε θέση να διαθέσουν την απαιτούμενη ποσότητα μνήμης. Η λειτουργία malloc είναι προσβάσιμη στο TURBO C, το header file alloc.h
ή stdlib.h
, και στο UNIX θα είναι διαθέσιμο στο αρχείο κεφαλίδας .
ΣΥΝΤΑΞΗ
Η σύνταξη αυτής της λειτουργίας έχει ως εξής:
malloc(number of elements * size of each element);
για παράδειγμα, int *ptr;
ptr=malloc(10*sizeof (int))
Όπου το μέγεθος αντιπροσωπεύει το μέγεθος της μνήμης που απαιτείται σε bytes (δηλαδή, ο αριθμός των γειτονικών θέσεων μνήμης που θα διατεθούν).
Αλλά, όπως αναφέρθηκε προηγουμένως, η λειτουργία malloc επιστρέφει έναν άκυρο δείκτη, συνεπώς, ένας χειριστής χυτηρίου πρέπει να αλλάξει τον τύπο του επιστρεφόμενου δείκτη βάσει της ανάγκης μας, η παραπάνω δήλωση θα μπορούσε να παρουσιαστεί με την ακόλουθη μορφή:
ptr_var=(type_cast* ) malloc (size)
Όταν το ptr_var
είναι το όνομα του δείκτη που διατηρεί τη διεύθυνση εκκίνησης του μπλοκ μνήμης, το type_cast
είναι ο τύπος δεδομένων στον οποίο πρέπει να μετασχηματιστεί ο δείκτης που επιστρέφεται (ή πληκτρολογήστε κενό) και το μέγεθος περιγράφει το μέγεθος του μπλοκ μνήμης που έχει οριστεί σε bytes .
Για παράδειγμα: int *ptr;
ptr=(int*) malloc (10 * size of (int));
Η μνήμη που διατίθεται από τη λειτουργία malloc περιέχει τιμή σκουπιδιών .
Σημειώστε ότι για να επαληθεύσετε ότι αν το αντίστοιχο αίτημα δημιουργείται από το malloc για να εκχωρήσει τη μνήμη που έχει χορηγηθεί από τη RAM του συστήματος ή απορριφθεί (σε περίπτωση που δεν υπάρχει διαθέσιμος χώρος). Μπορούμε να χρησιμοποιήσουμε την ιδιότητα στην οποία δεν έχει εκχωρηθεί η απαιτούμενη ποσότητα μνήμης η συνάρτηση malloc επιστρέφει ένα NULL.
Ορισμός του calloc ()
Η λειτουργία calloc λειτουργεί ακριβώς όπως η λειτουργία malloc, εξαιρουμένου του γεγονότος ότι απαιτεί δύο επιχειρήματα, όπως στην περίπτωση του malloc () χρειάζεται μόνο ένα επιχείρημα.
Για παράδειγμα: int*ptr;
ptr = (int*)calloc(10, 2);
Εδώ 2 καθορίζει το μέγεθος του τύπου δεδομένων σε ένα byte για το οποίο θέλουμε να γίνει η κατανομή, η οποία στην περίπτωση αυτή είναι 2 για ακέραιους αριθμούς. Και 10 σημαίνουν τον αριθμό των στοιχείων για τα οποία πρόκειται να γίνει η κατανομή.
Θυμηθείτε ότι το επιχείρημα που πέρασε στη συνάρτηση malloc ήταν (n * 10), είναι ένα μόνο επιχείρημα που δεν συγχέεται επειδή τα πολλά επιχειρήματα είναι πάντα διαχωρισμένα με κόμματα. Το επιχείρημα (n * 10) δεν έχει κόμματα ενδιάμεσα. Ως εκ τούτου, είναι ένα μόνο επιχείρημα, αν και όχι απλό, αλλά έκφραση.
Επιστρέφοντας στην παραπάνω δήλωση, ακολουθώντας την εκτέλεση της παραπάνω δήλωσης, ένα μπλοκ μνήμης 20 bytes δίνεται στο πρόγραμμα που ζητάει και η διεύθυνση του πρώτου μπλοκ αντιστοιχεί στο αιτούμενο πρόγραμμα και η διεύθυνση του πρώτου μπλοκ αντιστοιχεί στον δείκτη ptr.
Η μνήμη που διατίθεται από τη λειτουργία calloc κρατά όλα τα μηδενικά. Η λειτουργία calloc είναι επίσης διαθέσιμη στο αρχείο κεφαλίδας ή
στο TURBO C.
Βασικές διαφορές μεταξύ malloc και calloc
Οι κύριες διαφορές μεταξύ των λειτουργιών malloc και calloc είναι:
- Ένα μοναδικό μπλοκ απαιτούμενης μνήμης ανατίθεται σε malloc ενώ τα πολλαπλά τεμάχια της απαιτούμενης μνήμης κατανέμονται από το calloc.
- Η λειτουργία malloc δεν ξεκαθαρίζει και αρχικοποιεί την μνήμη που έχει παραχωρηθεί. Περιέχει τιμή απορριμμάτων και το στοιχείο της μνήμης που διατίθεται δεν μπορεί να τροποποιηθεί. Αντίθετα, το calloc αρχικοποιεί την μηδενική μνήμη.
- το malloc είναι ταχύτερο από το calloc λόγω της απαίτησης για πρόσθετα βήματα αρχικοποίησης στο calloc αλλά η διαφορά είναι αμελητέα.
- Μια άλλη διαφορά μεταξύ αυτών των δύο είναι ότι το calloc είναι ένα malloc + memset, το memset εκχωρεί τις φυσικές σελίδες στη μνήμη ενώ το malloc αποδίδει μόνο τη μνήμη από τον σωρό στην εικονική διεύθυνση.
Συμπέρασμα:
Και οι λειτουργίες malloc και calloc χρησιμοποιούνται για την κατανομή της μνήμης και έχουν το συγκεκριμένο πλεονέκτημα και τα μειονεκτήματα όπως το malloc είναι γρήγορο σε σύγκριση με το calloc. Επιπλέον, το malloc είναι πιο εύκολο στη χρήση καθώς χρειάζεται μόνο ένα επιχείρημα, επειδή το calloc διαθέτει μνήμη και αρχικοποιεί την περιοχή μνήμης με ZERO. Αλλά θα προτιμούσατε να χρησιμοποιήσετε το calloc όταν η αρχική μεταβλητή είναι πιο σημαντική για εσάς.