In questa lezione parleremo della funzione malloc in C e dell’allocazione dinamica della memoria.
Come abbiamo già studiato nelle lezioni precedenti, i puntatori consentono di gestire aree di memoria in maniera diretta. Non consentono però di espandere o costruire a runtime l’area di memoria destinata all’utilizzo dei dati.
A runtime ricordiamo che vuol dire durante l’esecuzione.
Cioè un vettore, ad esempio, deve essere dimensionato all’inizio del programma e in fase di runtime la sua dimensione fisica non può variare.
Però spesso accade di voler dimensionare le strutture dati durante l’esecuzione del programma.
In genere, se ad esempio vogliamo includere il caso in cui si voglia variare la dimensione dell’array, in base ad un valore espresso dall’utente, la soluzione più ovvia ma anche più ‘rozza’ che ci viene in mente è quella di sovradimensionare l’array con uno spreco inevitabile di memoria.
Invece, allocare la quantità di memoria di volta in volta necessaria e de-allocarla quando non serve più, produce chiaramente programmi più efficienti.
Apple iPad (7th Gen) (10.2 pollici, Wi-Fi, 32GB) - Grigio Siderale (Ricondizionato)
267,89 € (a partire da 18 Marzo 2024 14:59 GMT +01:00 - Altre informazioniProduct prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on [relevant Amazon Site(s), as applicable] at the time of purchase will apply to the purchase of this product.)HP Notebook G9 Intel i5-1235u 10 Core 4,4 Ghz 15,6" Full Hd, Ram 16Gb Ddr4, Ssd Nvme 500Gb M2, Hdmi, Usb 3.0, Wifi, Lan,Bluetooth, Webcam,Windows 11 Pro
509,00 € (a partire da 18 Marzo 2024 14:37 GMT +01:00 - Altre informazioniProduct prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on [relevant Amazon Site(s), as applicable] at the time of purchase will apply to the purchase of this product.)ASUS Chromebook CX1 CX1400CKA, Notebook 14" Anti-Glare, Intel Celeron N4500, RAM 4GB, 64GB eMMC, Intel UHD Graphics 600, ChromeOS, Argento
229,00 € (a partire da 18 Marzo 2024 14:37 GMT +01:00 - Altre informazioniProduct prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on [relevant Amazon Site(s), as applicable] at the time of purchase will apply to the purchase of this product.)Per fare ciò ci vengono in auto le funzioni malloc, calloc, free e realloc in C, che servono a creare e gestire oggetti dinamici.
Uso della funzione malloc in C
La funzione malloc in C serve dunque ad allocare un’area di memoria durante l’esecuzione del programma.
La sintassi è questa:
void *malloc(size_t)
con size_t indichiamo la quantità di memoria (numero di byte) da allocare.
La funzione malloc ritorna un puntatore, di tipo void, al primo byte dell’area allocata.
Ricordiamo che, secondo lo standard, un puntatore di tipo void può essere assegnato a qualsiasi tipo di puntatore.
Per evitare possibili problemi con i compilatori, è consigliabile effettuare un’operazione di cast per adeguare il valore di ritorno al tipo di puntatore richiesto.
Facciamo quindi un semplice esempio a scopo didattico di utilizzo di malloc in C:
#include <stdio.h>
#include <stdlib.h>
int main() {
int *p; //dichiariamo il puntatore a 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;
}
In questo esempio si dichiara il puntatore come variabile intera e poi, utilizzando la funzione malloc, il programma gli permette di allocare un’area di memoria sufficientemente grande da poter contenere un numero intero.
Dopo aver effettuato l’allocazione assegniamo all’area di memoria puntata da p un valore, nell’esempio assegno il valore 50.
Infine stampo il valore assegnato per verificare che la locazione di memoria contiene effettivamente il valore assegnato.
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");
.....
Alcuni link utili
Somma elementi diagonale principale di una matrice
HP, Pc desktop i7 pronto all'uso,16 Gb Ram, ssd 512Gb, Wi Fi, Libre Office, Windows 11 PRO, Computer fisso Pc i7 Pornto all'Uso (Ricondizionato)
155,00 € (a partire da 18 Marzo 2024 14:59 GMT +01:00 - Altre informazioniProduct prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on [relevant Amazon Site(s), as applicable] at the time of purchase will apply to the purchase of this product.)Firma digitale Wacom DTU-1031X 2540lpi (Linee per Pollice) 222.72 x 125.28mm USB Nero, Grigio tavoletta Grafica (Ricondizionato)
200,00 € (a partire da 18 Marzo 2024 15:18 GMT +01:00 - Altre informazioniProduct prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on [relevant Amazon Site(s), as applicable] at the time of purchase will apply to the purchase of this product.)Apple iPad 10.2 (8th Gen) 128GB Wi-Fi - Grigio Siderale (Ricondizionato)
363,89 € (a partire da 18 Marzo 2024 15:18 GMT +01:00 - Altre informazioniProduct prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on [relevant Amazon Site(s), as applicable] at the time of purchase will apply to the purchase of this product.)Come sommare gli elementi della cornice esterna