C Allocazione dinamica della memoria utilizzando malloc (), calloc (), free () e realloc ()

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 voidcui 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 NULLpuntatore 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

Articoli interessanti...