Allocazione dinamica - malloc()
Fa parte della sezione Logica e flusso del percorso C di Coddy. Lezione 32 di 63.
Ora imparerai a conoscere malloc(), la funzione principale per richiedere memoria dall'heap durante l'esecuzione del programma. La funzione malloc() sta per "allocazione della memoria" e ti consente di allocare memoria dinamicamente quando ne hai bisogno, anziché dichiarare variabili di dimensione fissa in fase di compilazione.
La funzione malloc() accetta un argomento: il numero di byte che vuoi allocare. Restituisce un puntatore void al blocco di memoria allocato, oppure NULL se l’allocazione non riesce. Poiché restituisce un puntatore void, puoi assegnarlo direttamente a un puntatore tipizzato; in C il cast è facoltativo (a differenza del C++, che lo richiede).
#include <stdlib.h>
int *ptr = (int*)malloc(sizeof(int)); // Alloca memoria per un intero
// ptr ora punta a una posizione di memoria che può contenere un interoIl vantaggio principale di
malloc()è la flessibilità: puoi richiedere esattamente la quantità di memoria di cui hai bisogno durante l’esecuzione e questa memoria rimane disponibile finché non la liberi esplicitamente. Questo è particolarmente utile quando non sai di quanta memoria avrai bisogno finché il tuo programma non è in esecuzione.
Ricorda di includere <stdlib.h> per usare malloc(); in C, convertire esplicitamente il puntatore void restituito è facoltativo, poiché viene convertito automaticamente nel tipo a cui lo assegni.
Sfida
FacileScrivi un programma C che illustri l’allocazione dinamica della memoria usando malloc() per creare e utilizzare un singolo intero nell’heap. Il tuo programma deve:
- Usare
malloc()per allocare dinamicamente memoria per un intero - Convertire il puntatore void restituito in un puntatore a intero
- Leggere un valore intero dall’input dell’utente
- Memorizzare il valore inserito nella memoria allocata dinamicamente usando l’operatore di dereferenziazione
- Stampare il valore memorizzato nel formato:
Stored value: [value] - Calcolare e memorizzare il quadrato del valore nella stessa posizione di memoria
- Stampare il valore elevato al quadrato nel formato:
Squared value: [value]
Ricorda di includere l’intestazione <stdlib.h> per usare malloc(). Il tuo programma dovrebbe illustrare il flusso di lavoro di base dell’allocazione dinamica della memoria: richiedere memoria all’heap, usarla per memorizzare e manipolare dati e operare sulla memoria allocata tramite operazioni sui puntatori.
Per esempio, se l’utente inserisce 7, il tuo output dovrebbe essere:
Stored value: 7
Squared value: 49Questa sfida ti introduce al concetto fondamentale di allocazione dinamica della memoria, in cui la memoria viene richiesta durante l’esecuzione invece di essere fissata al momento della compilazione, offrendo ai tuoi programmi maggiore flessibilità nell’uso della memoria.
Provalo tu
#include <stdio.h>
#include <stdlib.h>
int main() {
// Leggi l'input
int input_value;
scanf("%d", &input_value);
// TODO: Scrivi il tuo codice qui sotto
// 1. Usa malloc() per allocare memoria per un intero
// 2. Converti il puntatore restituito in int*
// 3. Memorizza il valore di input nella memoria allocata
// 4. Stampa il valore memorizzato
// 5. Calcola e memorizza il quadrato nella stessa posizione
// 6. Stampa il valore al quadrato
return 0;
}Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Logica e flusso
1Fondamenti dei puntatori
Che cos’è un puntatore?Dichiarare i puntatoriL’operatore di indirizzo (&)L’operatore di dereferenziazione (*)Puntatori NULLRiepilogo: nozioni di base sui puntatori4Progetto: Utility di testo semplice
Panoramica del progettoConteggio dei caratteri2Puntatori e array
I nomi degli array come puntatoriElementi degli array e puntatoriAritmetica dei puntatoriConfrontare i puntatoriRiepilogo: attraversamento di un array con i puntatori5Puntatori e funzioni
Passaggio per valorePassare puntatori alle funzioniModificare le variabili tramite puntatoriUn esempio classico: scambiare valoriPassare array alle funzioniRiepilogo: argomenti puntatore nelle funzioni3Array di caratteri e stringhe
Stringhe come array di charIl terminatore nullInput di stringhe con scanfUso di strlen()Uso di strcpy()Uso di strcat()Uso di strcmp()Riepilogo: funzioni di base per le stringhe6Gestione della memoria
Memoria Stack vs. HeapAllocazione dinamica - malloc()Usare sizeof() per l'allocazioneVerificare il fallimento dell'allocazioneLiberare la memoria con free()Allocare con calloc()Riepilogo: array dinamico9Progetto: Inserimento semplice di un contatto
Progetto: Definire una struct ContattoFunzione per creare un contattoEsercitati da solo: Compilatore C online