Laboratorio di programmazione

Esercizio 8

Per scaricare il file sorgente di questo esercizio clicca qui
Per scaricare il file eseguibile di questo esercizio clicca qui

All' inizio di questo programma troviamo:

Define è una direttiva di definizione e in questo caso è utilizzata per definire una costante. Per convenzione i nomi delle costanti sono scritti con la lettera maiuscola. La direttiva define istruisce il compilatore in modo di comportarsi nel seguente modo: nel codice sorgente sostituisce tutte le occorrenze di SPAZIO con il valore 100. Procedendo viene dichiarata una variabile di tipo intero, due puntatori a char e un array di puntatori a char.

L' array di puntatori è inizializato con due stringhe, in modo che ap[0] sarà il puntatore al primo elemento della stringa "ciao" (come visto nell' esercizio 4), mentre ap[1] sarà il puntatore al primo elemento della stringa "pippo". Stampiamo le due stringhe nel seguente modo:

L' esercizio procede con una novità, l' utilizzo della funzione malloc().

Questa funzione è utilizzata per l'allocazione di memoria in C. Quando viene chiamata, passandole come parametro il numero di byte di memoria necessari, malloc(), trova e riserva un blocco di memoria della dimensione richiesta e restituisce un indirizzo del primo byte del blocco di memoria ( ovvero un puntatore al blocco di memoria). Infatti nel nostro caso l' indirizzo del primo byte del blocco di memoria viene assegnato al puntatore ptr, mentre il numero di byte da riservare in memoria è indicato dalla costante SPAZIO, quindi 100 byte di memoria. Si noti che prima della chiamata a funzione malloc(), è stato inserito (char*) che è un casting esplicito. Ogni dato ha un tipo specifico, e spesso capita che nella stessa istruzione si devono usare dati di tipo diverso. In alcuni casi il compilatore è in grado di gestire da se la situazione, in altri casi è invece opportuno convertire esplicitamente un tipo di dato in un altro (casting esplicito). Nel nostro caso indichiamo con il casting (char*) che il puntatore al primo elemento del blocco di memoria è di tipo puntatore a char. Si noti che il programma funziona anche senza questo casting, ma alcuni compilatori avvertono che non è stato indicata nessuna conversione in questo modo:
[Warning] assignment makes pointer from integer without a cast
Con un costrutto if-else verifichiamo che non ci siamo stati problemi nell' allocare la memoria di 100 byte da noi richiesta:

Successivamente anche il puntatore p viene fatto puntare al primo byte del blocco di memoria riservato con la funzione malloc().

Il ciclo for indicato sopra non fa altro che assegnare ai byte memorizati, partendo dal primo byte allocato in memoria, i numeri interi da 65 a 90 che corrispondono alle lettere dell' alfabeto nel codice ASCII. Alla fine del ciclo viene inserito il carattere null (terminatore di stringhe). A questo punto per stampare l' intero alfabeto o solo qualche lettera dell' alfabeto basterà fare:

Alla funzione puts, viene passato il puntatore ptr, in quanto esso punta ancora al primo elemento del blocco di memoria a differenza di p che è stato incrementato all' interno del ciclo for. Il risultato sarà:























































Tutto quanto riportato in questa pagina è a puro scopo informativo personale. Se non ti trovi in accordo con quanto riportato nella pagina, vuoi fare delle precisazioni, vuoi fare delle aggiunte o hai delle proposte e dei consigli da dare, puoi farlo mandando un email. Ogni indicazione è fondamentale per la continua crescita del sito.