C Dynamic Memory Allocation Χρησιμοποιώντας malloc (), calloc (), free () & realloc ()

Πίνακας περιεχομένων

Σε αυτό το σεμινάριο, θα μάθετε να κατανέμετε δυναμικά τη μνήμη στο πρόγραμμα C χρησιμοποιώντας τυπικές λειτουργίες βιβλιοθήκης: malloc (), calloc (), free () και realloc ().

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

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

Για να κατανέμει δυναμικά μνήμης, συναρτήσεις βιβλιοθήκης είναι malloc(), calloc(), realloc()και free()χρησιμοποιούνται. Αυτές οι συναρτήσεις ορίζονται στο αρχείο κεφαλίδας.

C malloc ()

Το όνομα "malloc" σημαίνει κατανομή μνήμης.

Η malloc()συνάρτηση διατηρεί ένα μπλοκ μνήμης του καθορισμένου αριθμού byte. Και, επιστρέφει έναν δείκτη του voidοποίου μπορεί να μεταφερθεί σε δείκτες οποιασδήποτε μορφής.

Σύνταξη malloc ()

 ptr = (castType*) malloc(size);

Παράδειγμα

 ptr = (float*) malloc(100 * sizeof(float));

Η παραπάνω δήλωση διαθέτει 400 byte μνήμης. Είναι επειδή το μέγεθος floatείναι 4 byte. Και, ο δείκτης ptr κρατά τη διεύθυνση του πρώτου byte στην εκχωρημένη μνήμη.

Η έκφραση οδηγεί σε ένα NULLδείκτη εάν η μνήμη δεν μπορεί να εκχωρηθεί.

C calloc ()

Το όνομα "calloc" σημαίνει συνεχόμενη κατανομή.

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

Σύνταξη calloc ()

 ptr = (castType*)calloc(n, size);

Παράδειγμα:

 ptr = (float*) calloc(25, sizeof(float));

Η παραπάνω δήλωση εκχωρεί συνεχόμενο χώρο στη μνήμη για 25 στοιχεία τύπου float.

C δωρεάν ()

Δυναμικά εκχωρημένη μνήμη δημιουργούνται είτε με calloc()είτε malloc()δεν παίρνει απελευθερώθηκαν από μόνοι τους. Πρέπει να χρησιμοποιήσετε ρητά free()για να απελευθερώσετε το χώρο.

Σύνταξη δωρεάν ()

 free(ptr);

Αυτή η δήλωση ελευθερώνει το χώρο που διατίθεται στη μνήμη που υποδεικνύεται από ptr.

Παράδειγμα 1: malloc () και δωρεάν ()

 // Program to calculate the sum of n numbers entered by the user #include #include int main() ( int n, i, *ptr, sum = 0; printf("Enter number of elements: "); scanf("%d", &n); ptr = (int*) malloc(n * sizeof(int)); // if memory cannot be allocated if(ptr == NULL) ( printf("Error! memory not allocated."); exit(0); ) printf("Enter elements: "); for(i = 0; i < n; ++i) ( scanf("%d", ptr + i); sum += *(ptr + i); ) printf("Sum = %d", sum); // deallocating the memory free(ptr); return 0; ) 

Εδώ, διαθέσαμε δυναμικά τη μνήμη για n αριθμό int.

Παράδειγμα 2: calloc () και δωρεάν ()

 // Program to calculate the sum of n numbers entered by the user #include #include int main() ( int n, i, *ptr, sum = 0; printf("Enter number of elements: "); scanf("%d", &n); ptr = (int*) calloc(n, sizeof(int)); if(ptr == NULL) ( printf("Error! memory not allocated."); exit(0); ) printf("Enter elements: "); for(i = 0; i < n; ++i) ( scanf("%d", ptr + i); sum += *(ptr + i); ) printf("Sum = %d", sum); free(ptr); return 0; ) 

C realloc ()

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

Σύνταξη του realloc ()

 ptr = realloc(ptr, x);

Εδώ, το ptr ανακατανέμεται με νέο μέγεθος x.

Παράδειγμα 3: realloc ()

 #include #include int main() ( int *ptr, i , n1, n2; printf("Enter size: "); scanf("%d", &n1); ptr = (int*) malloc(n1 * sizeof(int)); printf("Addresses of previously allocated memory: "); for(i = 0; i < n1; ++i) printf("%u",ptr + i); printf("Enter the new size: "); scanf("%d", &n2); // rellocating the memory ptr = realloc(ptr, n2 * sizeof(int)); printf("Addresses of newly allocated memory: "); for(i = 0; i < n2; ++i) printf("%u", ptr + i); free(ptr); return 0; )

Όταν εκτελείτε το πρόγραμμα, η έξοδος θα είναι:

 Εισαγάγετε μέγεθος: 2 Διευθύνσεις μνήμης που είχε εκχωρηθεί προηγουμένως: 26855472 26855476 Εισαγάγετε το νέο μέγεθος: 4 Διευθύνσεις μνήμης που εκχωρήθηκε πρόσφατα: 26855472 26855476 26855480 26855484

ενδιαφέροντα άρθρα...