Διαφορά μεταξύ malloc() και calloc()

Βασικές διαφορές μεταξύ malloc() και calloc()

  • Η συνάρτηση malloc() επιστρέφει μόνο την αρχική διεύθυνση και δεν τη μηδενίζει, από την άλλη πλευρά, η συνάρτηση calloc() επιστρέφει την αρχική διεύθυνση και την κάνει μηδέν.
  • Στη συνάρτηση malloc, ο αριθμός των ορισμάτων είναι 1, ενώ στη συνάρτηση calloc, ο αριθμός των ορισμάτων είναι 2.
  • Η απόδοση χρόνου malloc() είναι υψηλότερη από την calloc(), ενώ η malloc() δεν είναι ασφαλής σε σύγκριση με την calloc()
  • Το malloc δεν προετοιμάζει τη μνήμη, ενώ το calloc εκτελεί αρχικοποίηση μνήμης.
malloc() εναντίον calloc()
malloc() εναντίον calloc()

Τι είναι η δυναμική εκχώρηση μνήμης;

Δυναμική εκχώρηση μνήμης είναι μια διαδικασία εκχώρησης μνήμης κατά το χρόνο εκτέλεσης. Υπάρχουν τέσσερις ρουτίνες βιβλιοθήκης, calloc(), free(), realloc(), και malloc() που μπορεί να χρησιμοποιηθεί για την εκχώρηση μνήμης και την απελευθέρωσή της κατά την εκτέλεση του προγράμματος. Αυτές οι ρουτίνες ορίζονται στο αρχείο κεφαλίδας που ονομάζεται stdlib.h.

Τι είναι το malloc() ;

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

Ο δείκτης που επιστρέφεται είναι συνήθως τύπου void. Σημαίνει ότι μπορούμε να εκχωρήσουμε συνάρτηση malloc σε οποιονδήποτε δείκτη. Η πλήρης μορφή του malloc είναι η εκχώρηση μνήμης.

Τι είναι το calloc() ;

Συνάρτηση Calloc(). χρησιμοποιείται για την εκχώρηση πολλαπλών μπλοκ μνήμης. Είναι μια συνάρτηση δυναμικής εκχώρησης μνήμης που χρησιμοποιείται για την κατανομή της μνήμης σε πολύπλοκες δομές δεδομένων όπως πίνακες και δομές. Εάν αυτή η συνάρτηση δεν καταφέρει να εκχωρήσει αρκετό χώρο όπως έχει καθοριστεί, επιστρέφει μηδενικό δείκτη. Η πλήρης μορφή της συνάρτησης calloc είναι η συνεχής κατανομή.

Διαφορά μεταξύ malloc() και calloc()

Ακολουθούν σημαντικές διαφορές μεταξύ malloc() και calloc():

malloc () calloc()
Η συνάρτηση Malloc() θα δημιουργήσει ένα ενιαίο μπλοκ μνήμης μεγέθους που καθορίζεται από τον χρήστη. Η συνάρτηση Calloc() μπορεί να εκχωρήσει πολλαπλά μπλοκ μνήμης για μια μεταβλητή.
Η συνάρτηση Malloc περιέχει τιμή σκουπιδιών. Το μπλοκ μνήμης που εκχωρείται από μια συνάρτηση calloc αρχικοποιείται πάντα στο μηδέν.
Ο αριθμός του επιχειρήματος είναι 1. Ο αριθμός των ορισμάτων είναι 2.
Το Calloc είναι πιο αργό από το malloc. Το Malloc είναι πιο γρήγορο από το calloc.
Δεν είναι ασφαλές σε σύγκριση με το calloc. Είναι ασφαλές στη χρήση σε σύγκριση με το malloc.
Η απόδοση χρόνου είναι υψηλότερη από την calloc(). Η απόδοση χρόνου είναι χαμηλότερη από την malloc().
Η συνάρτηση 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<stdlib.h>
#include<stdio.h>
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

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

Ο βρόχος For χρησιμοποιείται για την επανάληψη της τιμής μιας μεταβλητής "i" και την εκτύπωση του αθροίσματος. Τέλος, η λειτουργία free χρησιμοποιείται για την απελευθέρωση του δείκτη.

#include <stdio.h>
#include <stdlib.h>
    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

Γιατί να χρησιμοποιήσω malloc() ;

Εδώ είναι οι λόγοι χρήσης malloc()

  • Θα πρέπει να χρησιμοποιήσετε malloc() όταν πρέπει να εκχωρήσετε μνήμη κατά το χρόνο εκτέλεσης.
  • Θα πρέπει να χρησιμοποιείτε το malloc όταν πρέπει να εκχωρήσετε αντικείμενα που πρέπει να υπάρχουν πέρα ​​από την εκτέλεση του τρέχοντος μπλοκ μνήμης.
  • Επιλέξτε malloc() εάν θέλετε να εκχωρήσετε μνήμη μεγαλύτερη από το μέγεθος αυτής της στοίβας.
  • Επιστρέφει τον δείκτη στο πρώτο byte του εκχωρημένου χώρου.
  • Επιτρέπει στους προγραμματιστές να εκχωρούν μνήμη όπως απαιτείται στο ακριβές ποσό.
  • Αυτή η συνάρτηση εκχωρεί ένα μέγεθος μπλοκ μνήμης byte από το σωρό.

Γιατί να χρησιμοποιήσετε calloc() ;

Εδώ είναι οι λόγοι χρήσης calloc()

  • Όταν πρέπει να ορίσετε την εκχωρημένη μνήμη στο μηδέν.
  • Μπορείτε να χρησιμοποιήσετε το calloc που επιστρέφει έναν δείκτη για να αποκτήσετε πρόσβαση στο σωρό μνήμης.
  • Χρησιμοποιείται όταν χρειάζεται να αρχικοποιήσετε τα στοιχεία στο μηδέν για να επιστρέψει έναν δείκτη στη μνήμη.
  • Για να αποτρέψετε την υπερχείλιση που είναι δυνατή με το malloc()
  • Χρησιμοποιήστε την calloc() για να ζητήσετε μια σελίδα που είναι γνωστό ότι έχει ήδη μηδενιστεί.