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

10 : Allocazione dinamica della memoria Vers . 8.3 – Ottobre 2023
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