====== Esercitazione allocazione dinamica ======
===== Esercizio 1: Sequenze e VLA =====
Realizzare un programma C che legge e memorizza in un VLA una sequenza di double di lunghezza non nota a tempo di compilazione.
Richiedere all'utente di specificare la lunghezza prima di immettere la sequenza.
===== Esercizio 2: Sequenze e malloc() =====
Modificare la soluzione all'esercizio 1 in modo da utilizzare la funzione ''malloc()'' per allocare l'array dopo aver letto la lunghezza.
Verificare la corretta allocazione e gestire gli errori.
===== Esercizio 3: Allocazioni in grossi blocchi =====
Eseguire il seguente programma C
#include
#include
#define SIZE 10000000000
int main (void) {
double * h;
h = malloc(SIZE*sizeof(double));
if ( h == NULL ) {
perror("malloc");
exit(EXIT_FAILURE);
}
printf("Allocato h = %p\n",(void *) h);
return 0;
}
cosa succede ? Cercate di capire che cosa succede quando va in esecuzione ''perror()'' andando a verificare il manuale (sezione 3 ''man 3 perror'')
===== Esercizio 4: realloc() =====
Modificare la soluzione all'esercizio 2 in modo da utilizzare la funzione ''relloc()'' per fare crescere dinamicamente l'array senza richiedere la lunghezza della sequenza.
Verificare la corretta allocazione e gestire gli errori.
===== Esercizio 5: Funzione di allocazione/deallocazione di matrici =====
Le matrici possono essere rappresentate come array di puntatori a righe.
Si richiede di implementare le funzioni per la creazione e la deallocazione di matrici ''nxm'' di double. In particolare, la funzione
/** crea una matrice di double rappresentata come array di puntatori a righe
\param n numero di righe
\param m numero di colonne
\retval NULL se si e' verificato un errore
\retval p puntatore alla matrice allocata altrimenti
*/
double ** mat_new (unsigned n, unsigned m);
crea una matrice con n righe ed m colonne e ne restituisce il puntatore. E
/** libera la memoria occupata da una matrice di double rappresentata come array di puntatori a righe
\param a puntatore alla matrice da deallocare
\param n numero di righe
*/
void mat_free (double** a, unsigned n);
Sviluppare un opportuno main che testa che l'allocazione e la deallocazione siano stata effettuata correttamente, anche in caso di errori in corso d'opera.