L’allocazione dinamica della memoria in C. Quando farne uso?

Come è organizzata la memoria in C

Il linguaggio di programmazione C è per natura un linguaggio molto flessibile, tale flessibilità si evidenzia molto nella gestione dell’allocazione dinamica della memoria. Malloc e realloc sono funzioni per l’allocazione dinamica delle memoria in C.


Due aree di memoria per allocare dati: Stack e heap

Il linguaggio gestisce due tipi di aree, dove alloca le variabili, lo stack l’heap. Se non diversamente specificato dallo sviluppatore, il C memorizza tutti i dati nello stack e la rimozione di tali dati da quest’area avviene automaticamente quando perdono visibilità, o meglio, quando il blocco di codice, che le contiene, perde la visibilità o lo scope.

Tipo di memoriaDescrizione
StackÈ una parte statica, che contiene tutto ciò che sappiamo sarà allocato di certo
(tutto ciò che è dichiarato nel codice quindi, come una variabile int)
HeapÈ una parte dinamica, in cui la dimensione degli elementi può cambiare a “runtime”
ovvero durante l’esecuzione del programma

L’accesso allo stack è veloce ma nello stesso tempo le dimensioni in byte, a lui riservate, sono limitate, quindi, lo stack è un’area ben definita e limitata. Cosa diversa è per l’heap, tutto ciò che è espressamente allocato con malloc va a finire in questa area, e deve essere esplicitamente disallocato dal programmatore con la funzione free in C, pena il famigerato memory leak.

Esempio di utilizzo di malloc in C

#include <stdio.h>
#include <stdlib.h>

int main() {
	int *p; //dichiariamo il puntatore p come variabile intera

	//allocazione dinamica adatta a contenere un numero intero
	p=(int *) malloc(sizeof(int));
	
	*p=50; 
	
	printf("*p vale %d\n", *p);

   return 0;
}

Se l’allocazione non avviene correttamente il puntatore assume valore NULL.

È consigliabile dunque effettuare un test sul contenuto del puntatore, in modo tale che, se l’allocazione non avviene correttamente (per esempio se non abbiamo sufficiente spazio di memoria), si ha ad esempio un messaggio d’errore o la fuoriuscita dal programma.

Quindi basterà fare un controllo del tipo:

if (p==NULL)
 printf("non è possibile allocare");

Gli smart Pointer in C++

Il C++ risolve questo problema con il ricorso ai puntatori intelligenti, chiamati anche Smart Pointer. Si fa ricorso a malloc, quindi, all’allocazione della memoria per le variabili da memorizzare nell’heap, quando si devono gestire, ad esempio, strutture dati o oggetti di modeste dimensioni. Ma per tutto ciò che appartiene ai tipi di dato nativi del C, ad esempio, come interi o stringhe, lo stack è da considerarsi la soluzione migliore.



Se sei interessato a scoprire gli algoritmi, le strutture dati dell’informatica, ed implementarne il codice col linguaggio di programmazione C, con l’aiuto di un docente d’eccezioneclicca qui. oppure se vuoi renderti conto della validità del corso puoi seguire gratuitamente le prime tre lezioni, cliccando sui link sottostanti:

1 – Benvenuto

2 – Introduzione ad algoritmi e strutture dati

3 – Variabili e costanti



Potrebbe interessarti anche

phpcodewizard - un generatore di codice PHP
Seguimi su

Antonio Lamorgese

Amministratore di rete, programmatore ed esperto di pratiche SEO. Dopo anni di esperienza nel settore, ho ideato un generatore di codice PHP Scopri di più su https://www.phpcodewizard.it.