File Binari
- Differenze tra file di testo e file binari.
- funzioni per letture scrittura: fwrite fread
- file binari strutturati, funzioni per movimento: fseek, ftell, rewind
- utilizzo per memorizzare dati in formato binario: esempio, vettori, matrici.
- utilizzo per creare piccoli database: vedere anche libro.
Memoria Dinamica
- Differenza tra stack e heap: guardate velocemente la figura in basso nell’articolo seguente (articolo), poi leggete giusto l’inizio di (questo).
- API: malloc, calloc, free, realloc.
- malloc, tipo di ritorno come puntatore non tipato (void *), cast implicito in C99, (ma non in C++) quindi meglio farlo.
int *p = (int *) malloc(sizeof(int));
- se la malloc restituisce NULL la memoria fisica è esaurita, (difficile con i sistemi di memoria dinamica moderni, ma non controllare significa costruire codice non robusto: consiglio creare una funzione xmalloc che controlla subito dopo aver fatto la malloc se il puntatore è NULL), cosi si evita di controllare sempre.
- Attenzione la memoria restituita NON è inizializzata, se la si vuole inizializzata (a zero) usare calloc.
- realloc è come una free+malloc ma cerca di creare il nuovo blocco allungando o restringendo il blocco esistente per mantenere località.
- Utilizzo:
- Allocazione dinamica di vettori. Importante caso particolare di questo: allocazione dinamica di stringhe. Utilizzo tipico, funzione strdup:
char * strdup(const char * s) { size_t len = 1+strlen(s); char *p = malloc(len); return p ? memcpy(p, s, len) : NULL; }
- Allocazione dinamica di matrici: esempio.
- Strutture dati dinamiche: liste singolarmente linkate, liste doppiamente linkate, liste bidirezionali.
- Allocazione dinamica di vettori. Importante caso particolare di questo: allocazione dinamica di stringhe. Utilizzo tipico, funzione strdup: