C - Gestione della memoria
Questo capitolo spiega la gestione dinamica della memoria in C. Il linguaggio di programmazione C fornisce diverse funzioni per l'allocazione e la gestione della memoria. Queste funzioni possono essere trovate in<stdlib.h> file di intestazione.
Sr.No. | Descrizione della funzione |
---|---|
1 | void *calloc(int num, int size); Questa funzione alloca un array di num elementi ciascuno dei quali sarà la dimensione in byte size. |
2 | void free(void *address); Questa funzione rilascia un blocco di blocco di memoria specificato dall'indirizzo. |
3 | void *malloc(int num); Questa funzione alloca un array di num byte e lasciarli non inizializzati. |
4 | void *realloc(void *address, int newsize); Questa funzione rialloca la memoria estendendola fino a newsize. |
Allocazione dinamica della memoria
Durante la programmazione, se sei consapevole della dimensione di un array, è facile e puoi definirlo come un array. Ad esempio, per memorizzare un nome di qualsiasi persona, può arrivare a un massimo di 100 caratteri, quindi puoi definire qualcosa come segue:
char name[100];
Ma ora consideriamo una situazione in cui non hai idea della lunghezza del testo che devi memorizzare, ad esempio, vuoi memorizzare una descrizione dettagliata di un argomento. Qui dobbiamo definire un puntatore a un carattere senza definire la quantità di memoria richiesta e successivamente, in base ai requisiti, possiamo allocare memoria come mostrato nell'esempio seguente:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
char name[100];
char *description;
strcpy(name, "Zara Ali");
/* allocate memory dynamically */
description = malloc( 200 * sizeof(char) );
if( description == NULL ) {
fprintf(stderr, "Error - unable to allocate required memory\n");
} else {
strcpy( description, "Zara ali a DPS student in class 10th");
}
printf("Name = %s\n", name );
printf("Description: %s\n", description );
}
Quando il codice precedente viene compilato ed eseguito, produce il risultato seguente.
Name = Zara Ali
Description: Zara ali a DPS student in class 10th
Lo stesso programma può essere scritto usando calloc(); l'unica cosa è che devi sostituire malloc con calloc come segue -
calloc(200, sizeof(char));
Quindi hai il controllo completo e puoi passare qualsiasi valore di dimensione durante l'allocazione della memoria, a differenza degli array in cui una volta definita la dimensione, non puoi cambiarla.
Ridimensionamento e rilascio della memoria
Quando il tuo programma esce, il sistema operativo rilascia automaticamente tutta la memoria allocata dal tuo programma ma come buona pratica quando non hai più bisogno di memoria dovresti rilasciare quella memoria chiamando la funzione free().
In alternativa, è possibile aumentare o diminuire la dimensione di un blocco di memoria allocato chiamando la funzione realloc(). Controlliamo ancora una volta il programma precedente e utilizziamo le funzioni realloc () e free () -
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
char name[100];
char *description;
strcpy(name, "Zara Ali");
/* allocate memory dynamically */
description = malloc( 30 * sizeof(char) );
if( description == NULL ) {
fprintf(stderr, "Error - unable to allocate required memory\n");
} else {
strcpy( description, "Zara ali a DPS student.");
}
/* suppose you want to store bigger description */
description = realloc( description, 100 * sizeof(char) );
if( description == NULL ) {
fprintf(stderr, "Error - unable to allocate required memory\n");
} else {
strcat( description, "She is in class 10th");
}
printf("Name = %s\n", name );
printf("Description: %s\n", description );
/* release memory using free() function */
free(description);
}
Quando il codice precedente viene compilato ed eseguito, produce il risultato seguente.
Name = Zara Ali
Description: Zara ali a DPS student.She is in class 10th
Puoi provare l'esempio precedente senza riallocare memoria extra e la funzione strcat () restituirà un errore a causa della mancanza di memoria disponibile nella descrizione.