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 correttoQuesto 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.
Sfida
FacileScrivi un programma in C che mostri l’uso corretto di sizeof() con malloc() per l’allocazione dinamica della memoria. Il tuo programma dovrebbe:
- Leggere dall’utente un intero
nche rappresenta il numero di elementi da allocare - Usare
malloc()consizeof()per allocare dinamicamente la memoria per un array dinvalori double - Convertire il puntatore void restituito in un puntatore a double
- Leggere dall’utente
nvalori double e memorizzarli nell’array allocato - Calcolare la memoria totale allocata in byte e stamparla nel formato:
Memory allocated: [bytes] bytes - Calcolare e stampare la media di tutti i valori con esattamente 2 cifre decimali nel formato:
Average: [value] - 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.1Il tuo output dovrebbe essere:
Memory allocated: 24 bytes
Average: 4.80
Largest: 7.80Questa 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;
}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