Menu
Coddy logo textTech

Usare sizeof() per l'allocazione

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

Sebbene malloc() ti permetta di allocare memoria dinamicamente, esiste una buona pratica importante che rende il tuo codice più portabile e manutenibile: usare l'operatore sizeof() per determinare quanti byte allocare.

L'operatore sizeof() restituisce il numero di byte necessari per memorizzare un determinato tipo di dati sul tuo sistema. Invece di codificare in modo rigido le dimensioni in byte, puoi lasciare che sizeof() calcoli automaticamente la quantità corretta:

// Invece di stimare le dimensioni in byte:
int *ptr = (int*)malloc(4);  // Presuppone che int occupi 4 byte

// Usa sizeof() per la portabilità:
int *ptr = (int*)malloc(sizeof(int));  // Sempre corretto

Questo approccio diventa particolarmente utile quando si allocano array. Per allocare spazio per più elementi, moltiplica il numero di elementi per la dimensione di ciascun elemento:

// Alloca spazio per 10 interi
int *arr = (int*)malloc(10 * sizeof(int));

// Alloca spazio per 5 valori double
double *values = (double*)malloc(5 * sizeof(double));

Usare sizeof() fa sì che il tuo codice funzioni correttamente su sistemi diversi, dove i tipi di dati potrebbero avere dimensioni differenti, e comunica chiaramente la tua intenzione di allocare spazio per un numero specifico di elementi di un determinato tipo.

challenge icon

Sfida

Facile

Scrivi un programma in C che mostri l’uso corretto di sizeof() con malloc() per l’allocazione dinamica della memoria. Il tuo programma dovrebbe:

  1. Leggere dall’utente un intero n che rappresenta il numero di elementi da allocare
  2. Usare malloc() con sizeof() per allocare dinamicamente la memoria per un array di n valori double
  3. Convertire il puntatore void restituito in un puntatore a double
  4. Leggere dall’utente n valori double e memorizzarli nell’array allocato
  5. Calcolare la memoria totale allocata in byte e stamparla nel formato: Memory allocated: [bytes] bytes
  6. Calcolare e stampare la media di tutti i valori con esattamente 2 cifre decimali nel formato: Average: [value]
  7. Trovare e stampare il valore più grande con esattamente 2 cifre decimali nel formato: Largest: [value]

Ricordati di includere l’header <stdlib.h> per usare malloc(). Il tuo programma dovrebbe mostrare come sizeof() assicura la corretta allocazione della memoria indipendentemente dalle dimensioni dei tipi di dati del sistema.

Per esempio, se l’input è:

3
2.5 7.8 4.1

Il tuo output dovrebbe essere:

Memory allocated: 24 bytes
Average: 4.80
Largest: 7.80

Questa sfida sottolinea l’importanza di usare sizeof() per rendere l’allocazione dinamica della memoria portabile e facile da mantenere, calcolando automaticamente il numero corretto di byte necessario per qualsiasi tipo di dati su qualsiasi sistema.

Provalo tu

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

int main() {
    // Leggi il numero di elementi
    int n;
    scanf("%d", &n);
    
    // TODO: Scrivi il tuo codice qui sotto
    // 1. Alloca memoria per n valori double usando malloc() e sizeof()
    // 2. Converti il puntatore restituito in double*
    // 3. Leggi n valori double e memorizzali nell'array allocato
    // 4. Calcola e stampa la memoria allocata in byte
    // 5. Calcola e stampa la media con 2 cifre decimali
    // 6. Trova e stampa il valore massimo con 2 cifre decimali
    
    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