Menu
Coddy logo textTech

Verificare il fallimento dell'allocazione

Fa parte della sezione Logica e flusso del percorso C di Coddy. Lezione 34 di 63.

Sebbene malloc() sia uno strumento potente per l'allocazione dinamica della memoria, c'è una realtà fondamentale che devi comprendere: malloc() può fallire. Quando il sistema esaurisce la memoria disponibile, malloc() non può soddisfare la tua richiesta e restituisce NULL invece di un indirizzo di memoria valido.

Questo significa che ogni volta che usi malloc(), devi verificare che abbia avuto successo prima di provare a usare il puntatore restituito. L’uso di un puntatore NULL farà arrestare il programma con un errore di segmentazione.

int *ptr = (int*)malloc(sizeof(int));

if (ptr == NULL) {
    printf("Memory allocation failed!\n");
    return -1;  // Esci dal programma o gestisci l'errore
}

// Qui si può usare ptr in sicurezza
*ptr = 42;

Questo controllo di NULL non è facoltativo: è essenziale per scrivere programmi C robusti. Anche se gli errori di allocazione della memoria sono rari nei sistemi moderni, possono verificarsi, soprattutto in ambienti con risorse limitate o quando si richiedono grandi quantità di memoria. Il codice C professionale include sempre questi controlli per prevenire arresti anomali e gestire gli errori in modo appropriato.

challenge icon

Sfida

Facile

Scrivi un programma in C che dimostri la corretta gestione degli errori quando si usa malloc() per l’allocazione dinamica della memoria. Il programma deve:

  1. Leggere dall’utente un intero n che rappresenta il numero di interi da memorizzare
  2. Usare malloc() con sizeof() per allocare dinamicamente la memoria per un array di n interi
  3. Verificare se l’allocazione della memoria è riuscita controllando se il puntatore restituito è NULL
  4. Se l’allocazione non riesce, stampare Memory allocation failed! e terminare il programma
  5. Se l’allocazione riesce, stampare Memory allocation successful!
  6. Leggere dall’utente n valori interi e memorizzarli nell’array allocato
  7. Calcolare e stampare la somma di tutti i valori nel formato: Sum: [value]
  8. Stampare il totale dei byte allocati nel formato: Bytes allocated: [value]

Ricorda di includere l’header <stdlib.h> per usare malloc(). Il programma deve dimostrare la pratica essenziale di verificare che l’allocazione sia riuscita prima di provare a usare la memoria allocata.

Per esempio, se l’input è:

4
10 20 30 40

L’output dovrebbe essere:

Memory allocation successful!
Sum: 100
Bytes allocated: 16

Questa sfida sottolinea l’importanza fondamentale della programmazione difensiva quando si lavora con l’allocazione dinamica della memoria, assicurandosi che i programmi gestiscano con eleganza i possibili errori di allocazione della memoria invece di bloccarsi inaspettatamente.

Provalo tu

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

int main() {
    // Leggi il numero di interi
    int n;
    scanf("%d", &n);
    
    // TODO: Scrivi il tuo codice qui
    // - Usa malloc() per allocare memoria per n interi
    // - Controlla se l'allocazione è riuscita
    // - Gestisci sia il caso di successo sia quello di errore
    // - Leggi gli interi e memorizzali
    // - Calcola la somma e il numero di byte allocati
    
    return 0;
}
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Logica e flusso

Esercitati da solo: Compilatore C online