logo

Dynamisk minneallokering i C ved å bruke malloc(), calloc(), free() og realloc()

Siden C er et strukturert språk, har det noen faste regler for programmering. En av dem inkluderer å endre størrelsen på en matrise. En matrise er en samling av elementer som er lagret på sammenhengende minneplasseringer.

matriser



Som man kan se, er lengden (størrelsen) på arrayen ovenfor 9. Men hva om det er et krav om å endre denne lengden (størrelsen)? For eksempel,

  • Hvis det er en situasjon der bare 5 elementer er nødvendig for å legges inn i denne matrisen. I dette tilfellet sløser de resterende 4 indeksene bare bort minne i denne matrisen. Så det er et krav om å redusere lengden (størrelsen) på matrisen fra 9 til 5.
  • Ta en annen situasjon. I denne er det en rekke av 9 elementer med alle 9 indeksene fylt. Men det er behov for å legge inn 3 elementer til i denne matrisen. I dette tilfellet kreves det 3 indekser til. Så lengden (størrelsen) på matrisen må endres fra 9 til 12.

Denne prosedyren er referert til som Dynamisk minnetildeling i C .
Derfor, C Dynamisk minnetildeling kan defineres som en prosedyre der størrelsen på en datastruktur (som Array) endres i løpet av kjøretiden.
C gir noen funksjoner for å oppnå disse oppgavene. Det er 4 bibliotekfunksjoner levert av C definert under header-fil for å lette dynamisk minneallokering i C-programmering. De er:

  1. malloc()
  2. calloc()
  3. gratis()
  4. realloc()

La oss se på hver av dem mer detaljert.



strengformat

C malloc()-metoden

De malloc eller minnetildeling metoden i C brukes til å dynamisk tildele en enkelt stor blokk med minne med den angitte størrelsen. Den returnerer en peker av typen void som kan støpes inn i en peker av hvilken som helst form. Den initialiserer ikke minne ved utførelsestidspunktet, slik at den har initialisert hver blokk med standard søppelverdi i utgangspunktet.

Syntaks for malloc() i C

ptr = (cast-type*) malloc(byte-size)   For Example:>

ptr = (int*) malloc(100 * sizeof(int));
Siden størrelsen på int er 4 byte, vil denne setningen tildele 400 byte med minne. Og pekeren ptr holder adressen til den første byten i det tildelte minnet.



Hvis plassen er utilstrekkelig, mislykkes tildelingen og returnerer en NULL-peker.

Eksempel på malloc() i C

C




#include> #include> int> main()> {> >// This pointer will hold the> >// base address of the block created> >int>* ptr;> >int> n, i;> >// Get the number of elements for the array> >printf>(>'Enter number of elements:'>);> >scanf>(>'%d'>,&n);> >printf>(>'Entered number of elements: %d '>, n);> >// Dynamically allocate memory using malloc()> >ptr = (>int>*)>malloc>(n *>sizeof>(>int>));> >// Check if the memory has been successfully> >// allocated by malloc or not> >if> (ptr == NULL) {> >printf>(>'Memory not allocated. '>);> >exit>(0);> >}> >else> {> >// Memory has been successfully allocated> >printf>(>'Memory successfully allocated using malloc. '>);> >// Get the elements of the array> >for> (i = 0; i ptr[i] = i + 1; } // Print the elements of the array printf('The elements of the array are: '); for (i = 0; i printf('%d, ', ptr[i]); } } return 0; }>

>

medieoverføring
>

Produksjon

Enter number of elements: 5 Memory successfully allocated using malloc. The elements of the array are: 1, 2, 3, 4, 5,>

C calloc()-metoden

  1. calloc eller sammenhengende tildeling metoden i C brukes til å dynamisk tildele det angitte antallet minneblokker av den angitte typen. den er veldig lik malloc(), men har to forskjellige punkter, og disse er:
  2. Den initialiserer hver blokk med en standardverdi '0'.
  3. Den har to parametere eller argumenter sammenlignet med malloc().

Syntaks for calloc() i C

ptr = (cast-type*)calloc(n, element-size); here, n is the no. of elements and element-size is the size of each element.>

For eksempel:

ptr = (float*) calloc(25, sizeof(float));
Denne setningen tildeler sammenhengende plass i minnet for 25 elementer hver med størrelsen på flottøren.

Hvis plassen er utilstrekkelig, mislykkes tildelingen og returnerer en NULL-peker.

Eksempel på calloc() i C

C




#include> #include> int> main()> {> >// This pointer will hold the> >// base address of the block created> >int>* ptr;> >int> n, i;> >// Get the number of elements for the array> >n = 5;> >printf>(>'Enter number of elements: %d '>, n);> >// Dynamically allocate memory using calloc()> >ptr = (>int>*)>calloc>(n,>sizeof>(>int>));> >// Check if the memory has been successfully> >// allocated by calloc or not> >if> (ptr == NULL) {> >printf>(>'Memory not allocated. '>);> >exit>(0);> >}> >else> {> >// Memory has been successfully allocated> >printf>(>'Memory successfully allocated using calloc. '>);> >// Get the elements of the array> >for> (i = 0; i ptr[i] = i + 1; } // Print the elements of the array printf('The elements of the array are: '); for (i = 0; i printf('%d, ', ptr[i]); } } return 0; }>

>

>

Produksjon

python skriv json til filen
Enter number of elements: 5 Memory successfully allocated using calloc. The elements of the array are: 1, 2, 3, 4, 5,>

C free() metode

gratis metoden i C brukes til å dynamisk de-allokere minnet. Minnet som er allokert ved hjelp av funksjonene malloc() og calloc() blir ikke deallokert av seg selv. Derfor brukes gratis()-metoden når den dynamiske minnetildelingen finner sted. Det bidrar til å redusere sløsing med minne ved å frigjøre det.

Syntaks for free() i C

free(ptr);>

Eksempel på free() i C

C




#include> #include> int> main()> {> >// This pointer will hold the> >// base address of the block created> >int> *ptr, *ptr1;> >int> n, i;> >// Get the number of elements for the array> >n = 5;> >printf>(>'Enter number of elements: %d '>, n);> >// Dynamically allocate memory using malloc()> >ptr = (>int>*)>malloc>(n *>sizeof>(>int>));> >// Dynamically allocate memory using calloc()> >ptr1 = (>int>*)>calloc>(n,>sizeof>(>int>));> >// Check if the memory has been successfully> >// allocated by malloc or not> >if> (ptr == NULL || ptr1 == NULL) {> >printf>(>'Memory not allocated. '>);> >exit>(0);> >}> >else> {> >// Memory has been successfully allocated> >printf>(>'Memory successfully allocated using malloc. '>);> >// Free the memory> >free>(ptr);> >printf>(>'Malloc Memory successfully freed. '>);> >// Memory has been successfully allocated> >printf>(>' Memory successfully allocated using calloc. '>);> >// Free the memory> >free>(ptr1);> >printf>(>'Calloc Memory successfully freed. '>);> >}> >return> 0;> }>

>

>

Produksjon

Enter number of elements: 5 Memory successfully allocated using malloc. Malloc Memory successfully freed. Memory successfully allocated using calloc. Calloc Memory successfully freed.>

C realloc()-metoden

realloc eller omfordeling metoden i C brukes til å dynamisk endre minneallokeringen til et tidligere tildelt minne. Med andre ord, hvis minnet som tidligere ble tildelt ved hjelp av malloc eller calloc er utilstrekkelig, kan realloc brukes til å dynamisk re-allokere minne . re-allokering av minne opprettholder den allerede nåværende verdien og nye blokker vil bli initialisert med standard søppelverdi.

Syntaks for realloc() i C

ptr = realloc(ptr, newSize); where ptr is reallocated with new size 'newSize'.>

Hvis plassen er utilstrekkelig, mislykkes tildelingen og returnerer en NULL-peker.

Eksempel på realloc() i C

C




latex font
#include> #include> int> main()> {> >// This pointer will hold the> >// base address of the block created> >int>* ptr;> >int> n, i;> >// Get the number of elements for the array> >n = 5;> >printf>(>'Enter number of elements: %d '>, n);> >// Dynamically allocate memory using calloc()> >ptr = (>int>*)>calloc>(n,>sizeof>(>int>));> >// Check if the memory has been successfully> >// allocated by malloc or not> >if> (ptr == NULL) {> >printf>(>'Memory not allocated. '>);> >exit>(0);> >}> >else> {> >// Memory has been successfully allocated> >printf>(>'Memory successfully allocated using calloc. '>);> >// Get the elements of the array> >for> (i = 0; i ptr[i] = i + 1; } // Print the elements of the array printf('The elements of the array are: '); for (i = 0; i printf('%d, ', ptr[i]); } // Get the new size for the array n = 10; printf(' Enter the new size of the array: %d ', n); // Dynamically re-allocate memory using realloc() ptr = (int*)realloc(ptr, n * sizeof(int)); // Memory has been successfully allocated printf('Memory successfully re-allocated using realloc. '); // Get the new elements of the array for (i = 5; i ptr[i] = i + 1; } // Print the elements of the array printf('The elements of the array are: '); for (i = 0; i printf('%d, ', ptr[i]); } free(ptr); } return 0; }>

>

>

Produksjon

Enter number of elements: 5 Memory successfully allocated using calloc. The elements of the array are: 1, 2, 3, 4, 5, Enter the new size of the array: 10 Memory successfully re-allocated using realloc. The elements of the array are: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,>

Et annet eksempel for realloc()-metoden er:

C




#include> #include> int> main()> {> >int> index = 0, i = 0, n,> >*marks;>// this marks pointer hold the base address> >// of the block created> >int> ans;> >marks = (>int>*)>malloc>(>sizeof>(> >int>));>// dynamically allocate memory using malloc> >// check if the memory is successfully allocated by> >// malloc or not?> >if> (marks == NULL) {> >printf>(>'memory cannot be allocated'>);> >}> >else> {> >// memory has successfully allocated> >printf>(>'Memory has been successfully allocated by '> >'using malloc '>);> >printf>(>' marks = %pc '>,> >marks);>// print the base or beginning> >// address of allocated memory> >do> {> >printf>(>' Enter Marks '>);> >scanf>(>'%d'>, &marks[index]);>// Get the marks> >printf>(>'would you like to add more(1/0): '>);> >scanf>(>'%d'>, &ans);> >if> (ans == 1) {> >index++;> >marks = (>int>*)>realloc>(> >marks,> >(index + 1)> >*>sizeof>(> >int>));>// Dynamically reallocate> >// memory by using realloc> >// check if the memory is successfully> >// allocated by realloc or not?> >if> (marks == NULL) {> >printf>(>'memory cannot be allocated'>);> >}> >else> {> >printf>(>'Memory has been successfully '> >'reallocated using realloc: '>);> >printf>(> >' base address of marks are:%pc'>,> >marks);>////print the base or> >///beginning address of> >///allocated memory> >}> >}> >}>while> (ans == 1);> >// print the marks of the students> >for> (i = 0; i <= index; i++) {> >printf>(>'marks of students %d are: %d '>, i,> >marks[i]);> >}> >free>(marks);> >}> >return> 0;> }>

>

>

returnerer arrays i java

Produksjon: