4° Anno TEORIA 2. Allocazione dinamica della memoria | Page 17

10: Allocazione dinamica della memoria Vers. 9.1 – Ottobre 2025
ALGORITMO Array _ Dinamico PROCEDURA main()
p: PUNTATORE A INT n, i: INT
INIZIO
/* Check sul numero di elementi possibili dell ' array dinamico
VERA DINAMICITA ': unico limite la quantità di memoria assegnata al TASK */ RIPETI
Leggi( n) FINCHE’( n ≥ 1)
/* Allocazione area di memoria dimamica */ Alloca( p, n * DimensioneDi( INT))( 1) SE( p ≠ NULL) ALLORA
/* Ciclo di caricamento array dinamico */
PER i � 0 A( n – 1) ESEGUI Leggi(*( p + i))( 2) i � i + 1 FINE PER
/* Ciclo di visualizzazione array dinamico */
PER i � 0 A( n – 1) ESEGUI Scrivi(*( p + i))( 2) i � i + 1 FINE PER
/* Deallocazione area di memoria dimamica */ Dealloca( p)( 3)
ALTRIMENTI
Scrivi(" Errore nell’ allocazione ") FINE SE
RITORNA FINE
Grazie alla somma di un puntatore e di un intero, possiamo finalmente scrivere la pseudocodifica di un algoritmo che esegue il caricamento e la visualizazione di un vettore o array monodimensionale di n elementi interi ALLOCATO DINAMICAMENTE
( 1) La funzione Alloca(…), se terminata con esito positivo, collegherà il puntatore p ad un’ area di memoria allocata nello heap contenente n elementi aventi una lunghezza in byte tale da contenere tutti i dati del tipo previsto dalla funzione DimensioneDi(…). Nel nostro caso quindi p punta al prima locazione di memoria( delle n previste) in grado di contenere valori interi
N. B. Come abbiamo già detto la funzione Alloca(…) non inizializza in alcun modo i valori contenuti nelle locazioni di memoria fornite nello heap.
( 2) Il puntatore p, una volta che la funzione Alloca(…) ha avuto esito positivo, punterà alla prima locazione di memoria dell’ area complessiva assegnata nello heap. Per poter acccedere agli altri elementi è possibile utilizzare l’ aritmetica dei puntatori. In particolare, per quanto riguarda sia il caricamento sia la visualizzazione degli elementi dell’ array dinamico, sarà possibile accedere ai vari elementi tenendo presente l’ operazione somma di un puntatore ed un intero( in caso di iterazioni con indice crescente) oppure l’ operazione differenza di un puntatore ed un intero( in caso di iterazioni con indice decrescente)
( 3) La funzione Dealloca(…) scollegherà il puntatore p dall’ area di memoria allocata precedentemente nello heap dalla funzione Alloca(…) mettendola a disposizione per eventuali altre allocazioni dinamiche( garbage collection)
N. B. Ovviamente la funzione Dealloca(…) non ripulisce in alcun modo i valori precedentemente assegnati alle locazioni di memoria fornite nello heap.
( 3)
( 1) p
( 2) n elementi
0000111 110100010010100101010 1101010 001000101101010101010 0010110 100101110111110101010 0010101 111110100101111010101 1101101 110101110101011101011
Segmento Heap
Segmento stack
Segmento dati
Segmento codice
Autore: Rio Chierego( email: riochierego @ libero. it- sito web: www. riochierego. it) Pag. 17