• Non ci sono risultati.

Allocazione dinamica della memoria

N/A
N/A
Protected

Academic year: 2021

Condividi "Allocazione dinamica della memoria"

Copied!
20
0
0

Testo completo

(1)

Allocazione dinamica della memoria

Andrea Marin

Universit`a Ca’ Foscari Venezia Laurea in Informatica Corso di Programmazione part-time

a.a. 2011/2012

(2)

Tipi di memoria dati

Nella macchina astratta C esistono tre tipi di memoria per allocare le variabili:

1. Memoria statica 2. Stack

3. Memoria dinamica (heap)

(3)

Memoria statica

I Nella memoria statica vengono allocate le variabili globali i n t a ;

i n t v e c t [ 1 0 0 ] ; i n t main ( ) {

i n t c ; }

I a, vect sono allocati nella memoria statica

(4)

Lo stack

I La memoria stack `e usata per memorizzare i record di attivazione delle funzioni

I Il record di attivazione `e costituito da:

I L’indirizzo di codice dell’istruzione successiva a quella che ha invocato la funzione (indirizzo di rientro)

I I parametri della funzione

I Le variabili locali alla funzione

(5)

Esempio: codice

i n t f o o ( i n t z ) { i n t a ;

a=z +1;

r e t u r n a ; }

i n t main ( ) { i n t y =15;

i n t x ;

x = f o o ( , 1 3 ) ;

p r i n t f ( ‘ ‘ % d \ n ’ ’ , x ) ; r e t u r n 0 ;

}

(6)

Esempio /1: Stack

(7)

Esempio /2: Stack

(8)

Esempio /3: Stack

(9)

Uso dello stack e ricorsione

I L’uso dello stack consente ad una funzione di invocare un’altra funzione

I Questo causa la creazione di un nuovo record di attivazione sulla cima dello stack

I In questo modo le funzioni possono richiamare se stesse dando origine alla ricorsione

(10)

La memoria Heap

I Notiamo che sebbene -in generale- non sappiamo quanti record di attivazione saranno istanziati nello stack durante l’esecuzione del programma, la dimensione di un record di attivazione si conosce dall’analisi del codice

I La memoria dinamica consente di allocare spazi di memoria la cui dimensione si conosce solo in fase di esecuzione

I Esempio: scrivi un programma che dopo aver acquisito il numero di rilevazioni disponibili di una sonda di temperatura, le memorizzi in un vettore

I Quanto grande deve essere il vettore? `E impossibile

determinarlo in fase dall’analisi del codice perch`e dipende da un valore in input

(11)

Uso della memoria Heap

I In C, l’allocazione nella memoria heap e la sua liberazione sono espliciti, cio`e si usano apposite chiamate a funzioni

I La funzione malloc della libreria stdlib.h alloca uno spazio di memoria contiguo nell’heap e restituisce un puntatore al primo byte allocato

I In case di fallimento restituisce il valore NULL che corrisponde all’indirizzo riservato 0

I La funzione free della librerira stdlib.h libera lo spazio di memoria precendemente allocato con la malloc

(12)

malloc

I prototipo:

void* malloc(size t size);

I size t `e un tipo equivalente ad unsigned int. Il parametro specifica la quantit`a di byteda allocare

I Il tipo del valore restituito `e void*, che denota un valore di tipo indirizzo.

I void* specifica che il tipo dell’oggetto indicizzato `e sconosciuto

I Il valore `e l’indirizzo del primo byte allocato

I Se l’allocazione non ha successo viene resituito l’indirizzo NULL

(13)

Calcolo dello spazio richiesto: l’operatore sizeof

I Per conoscere quanti byte occupa un tipo ti dato si pu`o usare l’operatore sizeof

I sizeof(int): restituisce il numero di byte occupati da un int

I sizeof(float): restituisce il numero di byte occupati da un float

I . . .

(14)

Esempio di allocazione vettore di float

i n t main ( ) { f l o a t ∗ p t r ; i n t dim ;

s c a n f ( ‘ ‘ % d ’ ’ , &dim ) ; /∗ l e t t u r a d e l l a d i m e n s i o n e ∗/

i n t i ;

p t r = m a l l o c ( s i z e o f ( f l o a t ) ∗ dim ) ; i f ( p t r ) { /∗ s p a z i o a l l o c a t o ∗/

f o r ( i =0; i <dim ; i ++)

s c a n f ( ‘ ‘ % f ’ ’ , &p t r [ i ] ) ; /∗ s c a n f ( ‘ ‘ % f ’ ’ , p t r+ i ) ; ∗/

} . . }

(15)

Allocazione delle variabili

(16)

Eliminazione dello spazio allocato: free

I Prototipo:

void free(void* ptr)

I Il puntatore ptr deve contenere l’indirizzo del primo byte di memoria del blocco da liberare

I La memoria allocata va sempre liberata una volta terminato il suo uso

I I blocchi di memoria non liberati causano garbage

(17)

Acquisizione di una stringa: problemi

Dal manuale GNU C

The getline function is the preferred method for reading lines of text from a stream, including standard input. The other standard functions, including gets, fgets, and scanf, are too unreliable.

(Doubtless, in some programs you will see code that uses these unreliable functions, and at times you will come across compilers that cannot handle the safer getline function. As a professional, you should avoid unreliable functions and any compiler that requires you to be unsafe.)

I Cosa c’`e di cos`ı insicuro nel seguente codice?

c h a r s t r i n g a [ 1 0 0 ] ; s c a n f ( ‘ ‘ % s ’ ’ , s t r i n g a ) ;

(18)

getline

I Le stringhe vanno acquisite con la funzione getline della libreria stdlib

I prototipo:

size t getline(char** pstr, size t* pbytes, FILE* in);

I pstr `e un puntatore al puntatore al primo byte della stringa.

I pbytes `e un puntatore ad un intero che contiene il numero di bytes allocati per la stringa

I in `e lo stream in input (tipicamente stdin)

I Lo spazio allocato per la stringa potrebbe non essere sufficiente a contenere l’input. In questo caso la getline modifica l’allocazione dell’heap in modo da contenerlo. In questo case modifica anche il contenuto della variabile

(19)

Esempio

#i n c l u d e < s t d i o . h>

i n t main ( ) {

i n t b y t e s r e a d ; i n t n b y t e s = 9 ; c h a r ∗ m y s t r i n g ;

p r i n t f ( ‘ ‘ % s ’ ’ , ‘ ‘ P l e a s e e n t e r a l i n e o f t e x t . ’ ’ ) ; m y s t r i n g = m a l l o c ( n b y t e s + 1 ) ;

b y t e s r e a d = g e t l i n e (& m y s t r i n g , &n b y t e s , s t d i n ) ; i f ( b y t e s r e a d == −1)

p r i n t f ( ‘ ‘ ERROR ! ’ ’ ) ; e l s e {

p r i n t f ( ‘ ‘ You t y p e d : %s ’ ’ , m y s t r i n g ) ; f r e e ( m y s t r i n g ) ;

}

(20)

Situazione in memoria

Riferimenti

Documenti correlati

ESEMPIO: alloca spazio per un intero e memorizza in p l’indirizzo della memoria allocata int *p;.. p = (int*)

ƒ restituisce un puntatore che contiene l’indirizzo del blocco di memoria allocato, cioè della variabile, la quale sarà quindi accessibile dereferenziando il puntatore. ƒ la

Esercizio 0: Scrivere correttamente nome, cognome, matricola e posizione prima di svolgere ogni altro esercizio..

Scrivere una nuova classe Corso, dove ciascun corso `e caratterizzato da nome del corso, nome del docente titolare del corso, numero di crediti associati al corso, settore

Le variabili istanza sono il veicolo assicurato, identificato dalla targa (ad esempio, “CA 075 DS”), ed il valore assicurato RC.. Una polizza auto incendio e furto si differenzia da

La funzione malloc restituisce un puntatore alla prima regione di memoria libera allocata nella heap; se non esiste memoria sufficiente, ritorna un null pointer... Notare

L’allocazione dinamica della memoria si verifica quando un programma richiede al sistema operativo un blocco di memoria dichiarando, preventivamente, la dimensione dello stesso..

Ridimensiona un blocco Heap già allocato, portandolo a NewSize byte; restituisce un puntatore void al blocco di memoria riallocato ed eventualmente spostato. Il contenuto del