Questa è una vecchia versione del documento!
Esercitazione 8
Esercizio 1
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
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
Le matrici possono essere rappresentate come array di puntatori a righe.
Si richiede di implementare le procedure per la creazione e la deallocazione di matrici nxm
di double. In particolare, la procedura
/** crea una matrice di double con n righe ed m colonne e assegna il puntatore a tale struttuta al puntatore mat, se c'e' stato un errore assegna al puntatore mat la costante NULL. */ void mat_new (double ***mat, unsigned n, unsigned m);
E
/** libera la memoria occupata da una matrice di double rappresentata come array di puntatori a righe e pone il puntatore alla struttura mat a NULL. */ void mat_free (double*** mat, 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.
Esercizio 4
Le matrici possono essere rappresentate come array di puntatori a righe.
E se invece di una procedura per l'allocazione avessimo usato una funzione? Implementare adesso una funzione per la creazione di matrici nxm
di double. In particolare, la funzione deve essere
/** crea una matrice di double rappresentata come array di puntatori a righe e restituisce il puntatore alla struttura creata, NULL se c'e' stato un errore, */ double** mat_new (unsigned n, unsigned m);
Sviluppare un opportuno main che testa che l'allocazione sia stata effettuata correttamente, anche in caso di errori in corso d'opera.
Esercizio 5
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 6
Eseguire il seguente programma C
#include <stdio.h> #include <stdlib.h> #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
)