In questo tutorial imparerai ad allocare dinamicamente la memoria nel tuo programma C utilizzando le funzioni di libreria standard: malloc (), calloc (), free () e realloc ().
Come sai, un array è una raccolta di un numero fisso di valori. Una volta dichiarata la dimensione di un array, non è possibile modificarla.
A volte la dimensione dell'array che hai dichiarato potrebbe essere insufficiente. Per risolvere questo problema, è possibile allocare la memoria manualmente durante il runtime. Questo è noto come allocazione dinamica della memoria nella programmazione C.
Per allocare dinamicamente la memoria, funzioni di libreria sono malloc()
, calloc()
, realloc()
e free()
vengono utilizzati. Queste funzioni sono definite nel file di intestazione.
C malloc ()
Il nome "malloc" sta per allocazione della memoria.
La malloc()
funzione riserva un blocco di memoria del numero di byte specificato. E restituisce un puntatore di void
cui può essere eseguito il cast in puntatori di qualsiasi forma.
Sintassi di malloc ()
ptr = (castType*) malloc(size);
Esempio
ptr = (float*) malloc(100 * sizeof(float));
L'istruzione precedente alloca 400 byte di memoria. È perché la dimensione di float
è di 4 byte. Inoltre, il puntatore ptr contiene l'indirizzo del primo byte nella memoria allocata.
L'espressione restituisce un NULL
puntatore se la memoria non può essere allocata.
C calloc ()
Il nome "calloc" sta per allocazione contigua.
La malloc()
funzione alloca la memoria e lascia la memoria non inizializzata. Considerando che, la calloc()
funzione alloca memoria e inizializza tutti i bit a zero.
Sintassi di calloc ()
ptr = (castType*)calloc(n, size);
Esempio:
ptr = (float*) calloc(25, sizeof(float));
L'istruzione precedente alloca spazio contiguo in memoria per 25 elementi di tipo float
.
C libero ()
La memoria allocata dinamicamente creata con calloc()
o malloc()
non viene liberata da sola. È necessario utilizzare esplicitamente free()
per liberare lo spazio.
Sintassi di free ()
free(ptr);
Questa istruzione libera lo spazio allocato nella memoria puntata da ptr
.
Esempio 1: malloc () e 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; )
Qui, abbiamo allocato dinamicamente la memoria per n numero di int
.
Esempio 2: calloc () e 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 rialloc ()
Se la memoria allocata dinamicamente è insufficiente o superiore a quella richiesta, è possibile modificare la dimensione della memoria allocata in precedenza utilizzando la realloc()
funzione.
Sintassi di realloc ()
ptr = realloc(ptr, x);
Qui, ptr viene riallocato con una nuova dimensione x.
Esempio 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; )
Quando esegui il programma, l'output sarà:
Immettere la dimensione: 2 Indirizzi della memoria allocata in precedenza: 26855472 26855476 Immettere la nuova dimensione: 4 Indirizzi della nuova memoria allocata: 26855472 26855476 26855480 26855484