Πριν μάθετε τη διαφορά μεταξύ malloc και calloc ας μάθουμε-
Τι είναι η δυναμική κατανομή μνήμης;
Η δυναμική κατανομή μνήμης είναι μια διαδικασία εκχώρησης μνήμης κατά το χρόνο εκτέλεσης. Υπάρχουν τέσσερις ρουτίνες βιβλιοθήκης, calloc (), free (), realloc () και malloc () που μπορούν να χρησιμοποιηθούν για την εκχώρηση μνήμης και την απελευθέρωσή της κατά την εκτέλεση του προγράμματος. Αυτές οι ρουτίνες ορίζονται στο αρχείο κεφαλίδας που ονομάζεται stdlib.h.
Τι είναι το malloc ();
Είναι μια συνάρτηση που χρησιμοποιείται για να κατανέμει δυναμικά ένα μπλοκ μνήμης. Διατηρεί χώρο μνήμης καθορισμένου μεγέθους και επιστρέφει το μηδενικό δείκτη που δείχνει στη θέση μνήμης.
Ο δείκτης που επιστρέφεται είναι συνήθως άκυρος τύπου. Αυτό σημαίνει ότι μπορούμε να αντιστοιχίσουμε τη λειτουργία malloc σε οποιονδήποτε δείκτη. Η πλήρης μορφή malloc είναι η κατανομή μνήμης.
Σε αυτό το σεμινάριο, θα μάθετε:
- Τι είναι η δυναμική κατανομή μνήμης;
- Τι είναι το malloc ();
- Τι είναι το calloc ();
- Γιατί να χρησιμοποιήσετε το malloc ();
- Γιατί να χρησιμοποιήσετε calloc ();
- Σύνταξη malloc ()
- Σύνταξη calloc ()
- Παράδειγμα malloc () στο C
- Παράδειγμα calloc () στο C
- Διαφορά μεταξύ calloc () και malloc ()
Τι είναι το calloc ();
Η λειτουργία Calloc () χρησιμοποιείται για την εκχώρηση πολλαπλών μπλοκ μνήμης. Πρόκειται για μια δυναμική λειτουργία κατανομής μνήμης που χρησιμοποιείται για την κατανομή της μνήμης σε σύνθετες δομές δεδομένων, όπως πίνακες και δομές. Εάν αυτή η συνάρτηση αποτύχει να διαθέσει αρκετό χώρο όπως καθορίζεται, επιστρέφει null δείκτη. Η πλήρης μορφή της συνάρτησης calloc είναι συνεχόμενη κατανομή.
Γιατί να χρησιμοποιήσετε το malloc ();
Εδώ είναι οι λόγοι για τη χρήση malloc ()
- Θα πρέπει να χρησιμοποιήσετε το malloc () όταν πρέπει να εκχωρήσετε μνήμη κατά το χρόνο εκτέλεσης.
- Θα πρέπει να χρησιμοποιήσετε το malloc όταν πρέπει να εκχωρήσετε αντικείμενα που πρέπει να υπάρχουν πέρα από την εκτέλεση του τρέχοντος μπλοκ μνήμης.
- Πηγαίνετε για malloc () εάν πρέπει να εκχωρήσετε μνήμη μεγαλύτερη από το μέγεθος αυτής της στοίβας.
- Επιστρέφει το δείκτη στο πρώτο byte του εκχωρημένου χώρου.
- Επιτρέπει στους προγραμματιστές να εκχωρήσουν μνήμη, όπως απαιτείται στο ακριβές ποσό.
- Αυτή η συνάρτηση εκχωρεί μέγεθος μπλοκ μνήμης bytes από το σωρό.
Γιατί να χρησιμοποιήσετε calloc ();
Ακολουθούν οι λόγοι χρήσης του calloc ()
- Όταν πρέπει να ορίσετε την εκχωρημένη μνήμη στο μηδέν.
- Μπορείτε να χρησιμοποιήσετε calloc που επιστρέφει ένα δείκτη για να αποκτήσετε πρόσβαση στο σωρό της μνήμης.
- Χρησιμοποιείται όταν πρέπει να αρχικοποιήσετε τα στοιχεία στο μηδέν για να επιστρέψετε ένα δείκτη στη μνήμη.
- Για την αποφυγή υπερχείλισης που είναι δυνατή με malloc ()
- Χρησιμοποιήστε το calloc () για να ζητήσετε μια σελίδα που είναι γνωστό ότι έχει ήδη μηδενιστεί.
Σύνταξη malloc ()
Εδώ είναι μια σύνταξη malloc ()
ptr = (cast_type *) malloc (byte_size);
Στην παραπάνω σύνταξη, το ptr είναι δείκτης του cast_type. Η συνάρτηση malloc επιστρέφει ένα δείκτη στην εκχωρημένη μνήμη του byte_size.
Example: ptr = (int *) malloc (50)
Όταν εκτελεστεί με επιτυχία αυτή η δήλωση, δεσμεύεται χώρος μνήμης 50 byte. Η διεύθυνση του πρώτου byte του δεσμευμένου χώρου αντιστοιχεί στον δείκτη "ptr" του τύπου int.
Σύνταξη calloc ()
Εδώ είναι μια σύνταξη malloc ()
ptr = (cast_type *) calloc (n, size);
Η παραπάνω σύνταξη χρησιμοποιείται για την εκχώρηση n μπλοκ μνήμης του ίδιου μεγέθους. Μετά την κατανομή του χώρου μνήμης, όλα τα byte αρχικοποιούνται στο μηδέν. Επιστρέφεται ο δείκτης, ο οποίος βρίσκεται στο πρώτο byte του εκχωρημένου χώρου μνήμης.
Παράδειγμα malloc () στο C
Στον παρακάτω κώδικα, το sizeof (* ptr) χρησιμοποιείται για την εκχώρηση μπλοκ μνήμης 15 ακέραιων αριθμών. Στη δήλωση printf, βρίσκουμε την τιμή του 6ου ακέραιου.
#include#include int main(){int *ptr;ptr = malloc(15 * sizeof(*ptr));if (ptr != NULL) {*(ptr + 5) = 480;printf("Value of the 6th integer is %d",*(ptr + 5));}}
Παραγωγή:
Η τιμή του 6ου ακέραιου είναι 480
Παράδειγμα calloc () στο C
Το πρόγραμμα Γ γλώσσας παρακάτω υπολογίζει το άθροισμα των πρώτων δέκα όρων. Εάν η τιμή του δείκτη είναι μηδενική, τότε ο χώρος μνήμης δεν θα εκχωρηθεί.
Για το βρόχο χρησιμοποιείται για την επανάληψη της τιμής μιας μεταβλητής "i" και εκτύπωση του αθροίσματος Τέλος, η λειτουργία χωρίς λειτουργία χρησιμοποιείται για την απελευθέρωση του δείκτη.
#include#include int main() {int i, * ptr, sum = 0;ptr = calloc(10, sizeof(int));if (ptr == NULL) {printf("Error! memory not allocated.");exit(0);}printf("Building and calculating the sequence sum of the first 10 terms \n");for (i = 0; i < 10; ++i) { * (ptr + i) = i;sum += * (ptr + i);}printf("Sum = %d", sum);free(ptr);return 0;}
Παραγωγή:
Δημιουργία και υπολογισμός του αθροίσματος ακολουθίας των πρώτων 10 όρων n Άθροισμα = 45
Διαφορά μεταξύ calloc () και malloc ()
Το Herer είναι σημαντική διαφορά μεταξύ malloc () και calloc ():
malloc () | calloc () |
Η συνάρτηση Malloc () θα δημιουργήσει ένα μοναδικό μπλοκ μνήμης μεγέθους που καθορίζεται από τον χρήστη. | Η συνάρτηση Calloc () μπορεί να εκχωρήσει πολλά μπλοκ μνήμης για μια μεταβλητή. |
Η συνάρτηση Malloc περιέχει τιμή απορριμμάτων. | Το μπλοκ μνήμης που εκχωρείται από μια συνάρτηση calloc αρχικοποιείται πάντα στο μηδέν. |
Ο αριθμός των ορισμάτων είναι 2. | Ο αριθμός του ορίσματος είναι 1. |
Το Calloc είναι πιο αργό από το malloc. | Το Malloc είναι ταχύτερο από το calloc. |
Δεν είναι ασφαλές σε σύγκριση με το calloc. | Είναι ασφαλές στη χρήση σε σύγκριση με το malloc. |
Η απόδοση του χρόνου είναι υψηλότερη από το calloc (). | Η απόδοση του χρόνου είναι χαμηλότερη από το malloc (). |
Η συνάρτηση Malloc () επιστρέφει μόνο την αρχική διεύθυνση και δεν την κάνει μηδενική. | Πριν εκχωρήσετε τη διεύθυνση, η συνάρτηση Calloc () επιστρέφει την αρχική διεύθυνση και την κάνει μηδενική. |
Δεν εκτελεί αρχικοποίηση της μνήμης. | Εκτελεί εκκίνηση μνήμης. |
ΒΑΣΙΚΕΣ ΔΙΑΦΟΡΕΣ:
- Η συνάρτηση malloc () επιστρέφει μόνο την αρχική διεύθυνση και δεν την καθιστά μηδενική από την άλλη, η συνάρτηση calloc () επιστρέφει την αρχική διεύθυνση και την καθιστά μηδενική
- Στη συνάρτηση malloc, ο αριθμός ορισμάτων είναι 2 ενώ στη συνάρτηση calloc, ο αριθμός ορίσματος είναι 1.
- malloc () η απόδοση χρόνου είναι υψηλότερη από το calloc () ενώ το malloc () δεν είναι ασφαλές σε σύγκριση με το calloc ()
- Το malloc δεν προετοιμάζει τη μνήμη ενώ το calloc εκτελεί αρχικοποίηση μνήμης.