English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
In questo tutorial, imparerai a utilizzare le funzioni della libreria standard malloc(), calloc(), free() e realloc() per allocare memoria dinamicamente nei programmi in linguaggio C.
Come noto, un array è un insieme di valori di numero fisso. Dopo aver dichiarato la dimensione dell'array, non è possibile modificarla.
A volte, la dimensione dell'array dichiarato potrebbe non essere sufficiente. Per risolvere questo problema, è possibile allocare manualmente la memoria in esecuzione. Questo in linguaggio C è noto come allocazione di memoria dinamica.
È possibile utilizzare le funzioni della libreria standard malloc(), calloc(), realloc() e free() per allocare memoria dinamicamente. Queste funzioni sono definite nel file di intestazione <stdlib.h>.
Il nome "malloc" indica l'allocazione di memoria.
La funzione malloc() riserva un blocco di memoria di byte specificati. E restituisce un voidPuntatorepuò essere convertito in qualsiasi tipo di puntatore.
ptr = (castType*) malloc(size);
Esempio
ptr = (float*) malloc(100 * sizeof(float));
La seguente istruzione assegna 400 byte di memoria. Poiché la dimensione di un numero floating point è di 4 byte. E il puntatore ptr memorizza l'indirizzo del primo byte dell'allocazione di memoria.
Se non è possibile allocare memoria, l'espressione genererà un puntatore NULL.
Il nome "calloc" indica l'allocazione contigua.
La funzione malloc() assegna memoria e mantiene i bit non inizializzati. Mentre la funzione calloc() assegna memoria e inizializza tutti i bit a zero.
ptr = (castType*) calloc(n, size);
Esempio:
ptr = (float*) calloc(25, sizeof(float));
La seguente istruzione assegna uno spazio contiguo in memoria per 25 elementi di tipo float.
La memoria allocata dinamicamente con calloc() o malloc() non viene liberata automaticamente. È necessario liberare esplicitamente lo spazio utilizzando free().
free(ptr);
Questa istruzione libera lo spazio allocato nella memoria puntata da ptr.
//Programma per calcolare la somma dei numeri inseriti dall'utente #include <stdio.h> #include <stdlib.h> int main() { int n, i, *ptr, sum = 0; printf("Inserisci il numero di elementi: \n"); scanf("%d", &n); ptr = (int*)malloc(n * sizeof(int)); //Se non è possibile allocare memoria if(ptr == NULL) { printf("Errore! Memoria non allocata.\n"); exit(0); } printf("Inserisci l'elemento: \n"); for(i = 0; i < n; ++i) { scanf("%d", ptr + i); sum += *(ptr + i); } printf("Somma = %d", sum); //Liberazione della memoria free(ptr); return 0; }
In questo caso, abbiamo allocato memoria dinamica per n int.
//Programma per calcolare la somma dei numeri inseriti dall'utente #include <stdio.h> #include <stdlib.h> int main() { int n, i, *ptr, sum = 0; printf("Inserisci il numero di elementi: \n"); scanf("%d", &n); ptr = (int*)calloc(n, sizeof(int)); if(ptr == NULL) { printf("Errore! Memoria non allocata.\n"); exit(0); } printf("Inserisci l'elemento: \n"); for(i = 0; i < n; ++i) { scanf("%d", ptr + i); sum += *(ptr + i); } printf("Somma = %d", sum); free(ptr); return 0; }
Se la memoria dinamica allocata è insufficiente o supera la dimensione necessaria, è possibile utilizzare la funzione realloc() per cambiare la dimensione della memoria allocata in precedenza.
ptr = realloc(ptr, x);
In questo caso, ptr viene riassegnato alla nuova dimensione x.
#include <stdio.h> #include <stdlib.h> int main() { int *ptr, i, n1, n2; printf("Inserisci la dimensione: \n"); scanf("%d", &n1); ptr = (int*)malloc(n1 * sizeof(int)); printf("Indirizzo della memoria allocata in precedenza: \n"); for (i = 0; i < n1; ++i) printf("睵n", ptr + i); printf("\nInserisci la nuova dimensione: \n"); scanf("%d", &n2); //Riassegnazione della memoria ptr = realloc(ptr, n2 * sizeof(int)); printf("Nuova memoria allocata: \n"); for (i = 0; i < n2; ++i) printf("睵n", ptr + i); free(ptr); return 0; }
运行该程序时,输出为:
输入大小: 3 先前分配的内存地址: 7452312 7452316 7452320 输入新的大小: 5 新分配的内存地址: 7452312 7452316 7452320 7452324 7452328