C Alocare dinamică a memoriei folosind malloc (), calloc (), free () & realloc ()

În acest tutorial, veți învăța să alocați dinamic memoria în programul dvs. C folosind funcțiile standard ale bibliotecii: malloc (), calloc (), free () și realloc ().

După cum știți, o matrice este o colecție de un număr fix de valori. Odată ce mărimea unui tablou este declarată, nu o puteți schimba.

Uneori dimensiunea tabloului pe care l-ați declarat poate fi insuficientă. Pentru a rezolva această problemă, puteți aloca memorie manual în timpul rulării. Aceasta este cunoscută ca alocare dinamică a memoriei în programarea C.

Pentru a aloca dinamic memorie, funcțiile de bibliotecă sunt malloc(), calloc(), realloc()și free()sunt utilizate. Aceste funcții sunt definite în fișierul antet.

C malloc ()

Numele „malloc” înseamnă alocarea memoriei.

malloc()Funcția de rezervă un bloc de memorie numărul specificat de octeți. Și, returnează un indicator voidcare poate fi aruncat în indicatori de orice formă.

Sintaxa lui malloc ()

 ptr = (castType*) malloc(size);

Exemplu

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

Instrucțiunea de mai sus alocă 400 de octeți de memorie. Este pentru că dimensiunea lui floateste de 4 octeți. Și, indicatorul ptr deține adresa primului octet în memoria alocată.

Expresia are ca rezultat un NULLpointer dacă memoria nu poate fi alocată.

C calloc ()

Numele „calloc” înseamnă alocare contiguă.

malloc()Memoriei alocă mai funcționale și frunze memoria neinitializata. În timp ce calloc()funcția alocă memorie și inițializează toți biții la zero.

Sintaxa lui calloc ()

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

Exemplu:

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

Instrucțiunea de mai sus alocă spațiu contiguu în memorie pentru 25 de elemente de tip float.

C gratuit ()

Memoria alocată dinamic creată fie cu calloc()sau malloc()nu se eliberează singură. Trebuie să utilizați în mod explicit free()pentru a elibera spațiul.

Sintaxa lui free ()

 free(ptr);

Această declarație eliberează spațiul alocat în memoria indicată de ptr.

Exemplul 1: malloc () și free ()

 // 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; ) 

Aici, am alocat dinamic memoria pentru n număr de int.

Exemplul 2: calloc () și free ()

 // 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 ()

Dacă memoria alocată dinamic este insuficientă sau mai mare decât este necesară, puteți modifica dimensiunea memoriei alocate anterior folosind realloc()funcția.

Sintaxa realloc ()

 ptr = realloc(ptr, x);

Aici, ptr este realocat cu o nouă dimensiune x.

Exemplul 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; )

Când rulați programul, ieșirea va fi:

 Introduceți dimensiunea: 2 Adrese ale memoriei alocate anterior: 26855472 26855476 Introduceți noua dimensiune: 4 Adrese ale memoriei nou alocate: 26855472 26855476 26855480 26855484

Articole interesante...