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, c’è 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 nel tuo sistema. Invece di codificare direttamente le dimensioni in byte, puoi lasciare che sizeof() calcoli automaticamente la quantità corretta:
// Invece di indovinare 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 gli 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 numeri a precisione doppia
double *values = (double*)malloc(5 * sizeof(double));Usare sizeof() fa sì che il tuo codice funzioni correttamente su sistemi diversi, in cui i tipi di dati potrebbero avere dimensioni diverse, 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 dimostri l'uso corretto di sizeof() con malloc() per l'allocazione dinamica della memoria. Il tuo programma dovrebbe:
- Leggere un intero
ndall'utente, che rappresenta il numero di elementi da allocare - Usare
malloc()consizeof()per allocare dinamicamente la memoria per un array dinvalori double - Eseguire il cast del puntatore void restituito a un puntatore a double
- Leggere
nvalori double dall'utente 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]
Ricorda di includere l'header <stdlib.h> per usare malloc(). Il tuo programma dovrebbe dimostrare come sizeof() garantisca una 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 rafforza l'importanza di usare sizeof() per rendere l'allocazione dinamica della memoria portabile e manutenibile, calcolando automaticamente il numero corretto di byte necessari per qualsiasi tipo di dato 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 più grande 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