Sei sulla pagina 1di 126

Puntatori

Allocazione della Memoria


Puntatori e funzioni

Puntatori e Allocazione della Memoria


Lezione 6
Laboratorio di Programmazione I
Corso di Laurea in Informatica
A.A. 2016/2017

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Calendario delle lezioni

Lez. 1 - Introduzione allambiente Linux


Lez. 2 - Introduzione al C
Lez. 3 - Tipi primitivi e costrutti condizionali
Lez. 4 - Costrutti iterativi ed array
Lez. 5 - Funzioni, stack e visibilita variabili
Lez. 6 - Puntatori e memoria
Lez. 7 - Tipi di dati utente
Lez. 8 - Liste concatenate e librerie

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Sommario
1

Puntatori
Variabili puntatore
Aritmetica dei puntatori

Allocazione della Memoria


Organizzazione Memoria
Allocazione Dinamica della Memoria
Array bidimensionali

Puntatori e funzioni
Passaggio per riferimento
Funzioni e Gestione Memoria

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Errori comuni

void f ( i n t [ ] a ) {
...
}
i n t main ( ) {
int a[10];
f (a[10]) ;
return 0;
}

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Errori comuni

void f ( i n t [ ] a ) {
...
}
i n t main ( ) {
int a[10];
f (a[10]) ;
return 0;
}

f(a) invece di f(a[10])

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Errori comuni

float f () {
...
}
i n t main ( ) {
p r i n t f ( "%d \ n " , f ( ) ) ;
return 0;
}

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Errori comuni

float f () {
...
}
i n t main ( ) {
p r i n t f ( "%d \ n " , f ( ) ) ;
return 0;
}

%f invece di %d

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Errori comuni

i n t main ( ) {
i n t somma, n u m _ v al o r i ;
.....
p r i n t f ( " %.2 f \ n " , somma / n u m _ v a l o r i ) ;
return 0;
}

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Errori comuni

i n t main ( ) {
i n t somma, n u m _ v al o r i ;
.....
p r i n t f ( " %.2 f \ n " , somma / n u m _ v a l o r i ) ;
return 0;
}
somma / (float) num_valori

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Errori comuni

Funzione != Variabile

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Errori comuni

Funzione != Variabile
Programmi diventano pi complessi, attenzione alle
parentesi (chiudetele subito)

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Errori comuni

Funzione != Variabile
Programmi diventano pi complessi, attenzione alle
parentesi (chiudetele subito)
Evitate la duplicazione del codice (Esercizio 5.1)

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Variabili puntatore
Aritmetica dei puntatori

Outline
1

Puntatori
Variabili puntatore
Aritmetica dei puntatori

Allocazione della Memoria


Organizzazione Memoria
Allocazione Dinamica della Memoria
Array bidimensionali

Puntatori e funzioni
Passaggio per riferimento
Funzioni e Gestione Memoria

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Variabili puntatore
Aritmetica dei puntatori

Indirizzi di Memoria e Puntatori

In C possibile conoscere lindirizzo della cella di memoria


in cui memorizzata una variabile (o una funzione!!)
Operatore unario & restituisce lindirizzo di memoria di una
variabile, e.g &x

Puntatore: variabile che denota un indirizzo di memoria


nello spazio di indirizzamento del processo

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Variabili puntatore
Aritmetica dei puntatori

Variabili Puntatore
i n t a = 1 0 ; / / a una v a r i a b i l e i n t e r a ( i n i z . a 10)

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Variabili puntatore
Aritmetica dei puntatori

Variabili Puntatore
i n t a = 1 0 ; / / a una v a r i a b i l e i n t e r a ( i n i z . a 10)
i n t b ; / / b una v a r i a b i l e p u n t a t o r e ad i n t e r i

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Variabili puntatore
Aritmetica dei puntatori

Variabili Puntatore
i n t a = 1 0 ; / / a una v a r i a b i l e i n t e r a ( i n i z . a 10)
i n t b ; / / b una v a r i a b i l e p u n t a t o r e ad i n t e r i
b = &a ; / / b c o n t i e n e l i n d i r i z z o d i memoria d i a

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Variabili puntatore
Aritmetica dei puntatori

Variabili Puntatore
i n t a = 1 0 ; / / a una v a r i a b i l e i n t e r a ( i n i z . a 10)
i n t b ; / / b una v a r i a b i l e p u n t a t o r e ad i n t e r i
b = &a ; / / b c o n t i e n e l i n d i r i z z o d i memoria d i a
...
/ / A t t r a v e r s o l i n d i r i z z o d i memoria posso
manipolare i l c o nt e n u to d i una v a r i a b i l e
b = b 2 ;

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Variabili puntatore
Aritmetica dei puntatori

Variabili Puntatore
i n t a = 1 0 ; / / a una v a r i a b i l e i n t e r a ( i n i z . a 10)
i n t b ; / / b una v a r i a b i l e p u n t a t o r e ad i n t e r i
b = &a ; / / b c o n t i e n e l i n d i r i z z o d i memoria d i a
...
/ / A t t r a v e r s o l i n d i r i z z o d i memoria posso
manipolare i l c o nt e n u to d i una v a r i a b i l e
b = b 2 ;

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Variabili puntatore
Aritmetica dei puntatori

Dichiarare ed operare sui puntatori


nometipo * var
Dichiara una variabile puntatore con nome var
Ha tipo indirizzo delle variabili di tipo nometipo

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Variabili puntatore
Aritmetica dei puntatori

Dichiarare ed operare sui puntatori


nometipo * var
Dichiara una variabile puntatore con nome var
Ha tipo indirizzo delle variabili di tipo nometipo
Loperatore & viene usato per restituire lindirizzo di una
variabile
b = &a;
Lo posso usare per ottenere lindirizzo di una variabile
puntatore, e.g. &b!!

Loperatore * viene usato per accedere al contenuto di un


indirizzo di memoria memorizzato da un puntatore
(dereferenziazione)
*b = *b - 2;

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Variabili puntatore
Aritmetica dei puntatori

Le mille facce delloperatore *


Usato nella dichiarazione di una variabile determina un tipo
puntatore
int *a;

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Variabili puntatore
Aritmetica dei puntatori

Le mille facce delloperatore *


Usato nella dichiarazione di una variabile determina un tipo
puntatore
int *a;
Usato nei comandi invece esegue la dereferenziazione

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Variabili puntatore
Aritmetica dei puntatori

Le mille facce delloperatore *


Usato nella dichiarazione di una variabile determina un tipo
puntatore
int *a;
Usato nei comandi invece esegue la dereferenziazione
Allinterno di un espressione, da accesso al contenuto
dellindirizzo di memoria puntato
if (*a > 10) { ...

} else { ...

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Variabili puntatore
Aritmetica dei puntatori

Le mille facce delloperatore *


Usato nella dichiarazione di una variabile determina un tipo
puntatore
int *a;
Usato nei comandi invece esegue la dereferenziazione
Allinterno di un espressione, da accesso al contenuto
dellindirizzo di memoria puntato
if (*a > 10) { ...

} else { ...

A sinistra dellassegnamento, permette di modificare il


contenuto dellindirizzo di memoria puntato
*a = 10;

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Variabili puntatore
Aritmetica dei puntatori

Puntatori e tipi
E possibile dichiarare puntatori per tutti i tipi primitivi (e anche
le strutture)

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Variabili puntatore
Aritmetica dei puntatori

Puntatori e tipi
E possibile dichiarare puntatori per tutti i tipi primitivi (e anche
le strutture)
i n t a , b ; / / D i c h i a r a z i o n e m u l t i p l a ( r i p e t e r e )
f l o a t c , d ;
/ / c un p u n t a t o r e a f l o a t , d una
variabile float

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Variabili puntatore
Aritmetica dei puntatori

Puntatori e tipi
E possibile dichiarare puntatori per tutti i tipi primitivi (e anche
le strutture)
i n t a , b ; / / D i c h i a r a z i o n e m u l t i p l a ( r i p e t e r e )
f l o a t c , d ;
/ / c un p u n t a t o r e a f l o a t , d una
variabile float
double e , f ; / / f un p u n t a t o r e a p u n t a t o r i d i
double . . .
...
/ / . . q u i n d i f pu p u n t a r e a l l i n d i r i z z o d i e
f = &e ;

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Variabili puntatore
Aritmetica dei puntatori

Puntatori e tipi
E possibile dichiarare puntatori per tutti i tipi primitivi (e anche
le strutture)
i n t a , b ; / / D i c h i a r a z i o n e m u l t i p l a ( r i p e t e r e )
f l o a t c , d ;
/ / c un p u n t a t o r e a f l o a t , d una
variabile float
double e , f ; / / f un p u n t a t o r e a p u n t a t o r i d i
double . . .
...
/ / . . q u i n d i f pu p u n t a r e a l l i n d i r i z z o d i e
f = &e ;

NULL: costante predefinita (in stdio.h) che denota il


puntatore nullo

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Variabili puntatore
Aritmetica dei puntatori

Costanti e puntatori
Queste due dichiarazioni sono equivalenti, cio puntatori a
costanti intere
c o n s t i n t a ;
i n t c o n s t a ;

Non potete fare *a = 10!

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Variabili puntatore
Aritmetica dei puntatori

Costanti e puntatori
Queste due dichiarazioni sono equivalenti, cio puntatori a
costanti intere
c o n s t i n t a ;
i n t c o n s t a ;

Non potete fare *a = 10!


c o n s t i n t a ;
/ / Puntatore a c o s t a n t i i n t e r e
i n t c o n s t a ; / / P u n t a t o r e c o s t a n t e ad i n t e r i

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Variabili puntatore
Aritmetica dei puntatori

Costanti e puntatori
Queste due dichiarazioni sono equivalenti, cio puntatori a
costanti intere
c o n s t i n t a ;
i n t c o n s t a ;

Non potete fare *a = 10!


c o n s t i n t a ;
/ / Puntatore a c o s t a n t i i n t e r e
i n t c o n s t a ; / / P u n t a t o r e c o s t a n t e ad i n t e r i

Non sono equivalenti!!! Nel secondo caso non potete


modificare lindirizzo a cui punta a, ma potete cambiare il suo
contenuto con *a!

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Variabili puntatore
Aritmetica dei puntatori

Aritmetica dei puntatori


E possibile utilizzare alcuni degli operatori aritmetici classici
(+, -, ++, -, ...) per scrivere espressioni con i puntatori
i n t a [ 4 ] , p ; / / D i c h i a r o un a r r a y d i i n t e r i ed un
p u n t a t o r e ad i n t e r i

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Variabili puntatore
Aritmetica dei puntatori

Aritmetica dei puntatori


E possibile utilizzare alcuni degli operatori aritmetici classici
(+, -, ++, -, ...) per scrivere espressioni con i puntatori
i n t a [ 4 ] , p ; / / D i c h i a r o un a r r a y d i i n t e r i ed un
p u n t a t o r e ad i n t e r i

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Variabili puntatore
Aritmetica dei puntatori

Aritmetica dei puntatori


E possibile utilizzare alcuni degli operatori aritmetici classici
(+, -, ++, -, ...) per scrivere espressioni con i puntatori
i n t a [ 4 ] , p ; / / D i c h i a r o un a r r a y d i i n t e r i ed un
p u n t a t o r e ad i n t e r i

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Variabili puntatore
Aritmetica dei puntatori

Aritmetica dei puntatori


E possibile utilizzare alcuni degli operatori aritmetici classici
(+, -, ++, -, ...) per scrivere espressioni con i puntatori
i n t a [ 4 ] , p ; / / D i c h i a r o un a r r a y d i i n t e r i ed un
p u n t a t o r e ad i n t e r i

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Variabili puntatore
Aritmetica dei puntatori

Aritmetica dei puntatori


E possibile utilizzare alcuni degli operatori aritmetici classici
(+, -, ++, -, ...) per scrivere espressioni con i puntatori
i n t a [ 4 ] , p ; / / D i c h i a r o un a r r a y d i i n t e r i ed un
p u n t a t o r e ad i n t e r i

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Variabili puntatore
Aritmetica dei puntatori

Puntatori ed array (I)


Il nome di un array un puntatore costante al primo elemento
del vettore (int *const)

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Variabili puntatore
Aritmetica dei puntatori

Puntatori ed array (I)


Il nome di un array un puntatore costante al primo elemento
del vettore (int *const)
int
// I
p =
p =

a [ 4 ] , p ;
due comandi che seguono , sono e q u i v a l e n t i
&a [ 0 ] ; / / I n d i r i z z o d e l primo elemento d e l l a r r a y
a ; / / P u n t a t o r e a l ( primo elemento d e l ) a r r a y

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Variabili puntatore
Aritmetica dei puntatori

Puntatori ed array (I)


Il nome di un array un puntatore costante al primo elemento
del vettore (int *const)
int
// I
p =
p =

a [ 4 ] , p ;
due comandi che seguono , sono e q u i v a l e n t i
&a [ 0 ] ; / / I n d i r i z z o d e l primo elemento d e l l a r r a y
a ; / / P u n t a t o r e a l ( primo elemento d e l ) a r r a y

Loperatore array[] un abbreviazione per unoperazione


aritmetica su puntatori
int
// I
tmp
tmp

tmp ;
due assegnamenti che seguono sono e q u i v a l e n t i
= a [ 2 ] ; / / Terzo elemento d e l l a r r a y
= ( a +2) ; / / Contenuto d e l l i n d i r i z z o p u n t a t o da a +
(2 s i z e o f ( i n t ) )

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Variabili puntatore
Aritmetica dei puntatori

Puntatori ed array (II)

In quanto abbreviazione, [] pu essere usato su tutti i


puntatori, non solo su array
int
// I
tmp
tmp

a [ 3 ] , p = a , tmp ;
due assegnamenti che seguono sono e q u i v a l e n t i
= a[2];
= p[2];

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Variabili puntatore
Aritmetica dei puntatori

Puntatori ed array (II)

In quanto abbreviazione, [] pu essere usato su tutti i


puntatori, non solo su array
int
// I
tmp
tmp

a [ 3 ] , p = a , tmp ;
due assegnamenti che seguono sono e q u i v a l e n t i
= a[2];
= p[2];

Che succede se eseguo p = &tmp?

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Variabili puntatore
Aritmetica dei puntatori

Puntatori ed array (II)

In quanto abbreviazione, [] pu essere usato su tutti i


puntatori, non solo su array
int
// I
tmp
tmp

a [ 3 ] , p = a , tmp ;
due assegnamenti che seguono sono e q u i v a l e n t i
= a[2];
= p[2];

Che succede se eseguo p = &tmp? Che p punta allindirizzo


di memoria di tmp.

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Variabili puntatore
Aritmetica dei puntatori

Puntatori ed array (II)

In quanto abbreviazione, [] pu essere usato su tutti i


puntatori, non solo su array
int
// I
tmp
tmp

a [ 3 ] , p = a , tmp ;
due assegnamenti che seguono sono e q u i v a l e n t i
= a[2];
= p[2];

Che succede se eseguo p = &tmp? Che p punta allindirizzo


di memoria di tmp.
Anche a un puntatore ad interi: che succede se eseguo a =
&tmp?

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Variabili puntatore
Aritmetica dei puntatori

Il Codice non Compila!!! Perch?

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Variabili puntatore
Aritmetica dei puntatori

Il Codice non Compila!!! Perch?

int a[3] dichiara un puntatore costante a interi (int *const)


= Non posso modificare dove punta a!

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Variabili puntatore
Aritmetica dei puntatori

Cast esplicito

E possibile fare il cast esplicito di un puntatore ad un qualsiasi


altro tipo di puntatore

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Variabili puntatore
Aritmetica dei puntatori

Cast esplicito

E possibile fare il cast esplicito di un puntatore ad un qualsiasi


altro tipo di puntatore
i n t a = 8;
i n t b ;
/ / Puntatore a i n t e r i
double c ; / / P u n t a t o r e a double
...
b = &a ;
c = ( double ) b ;

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Variabili puntatore
Aritmetica dei puntatori

Cast esplicito

E possibile fare il cast esplicito di un puntatore ad un qualsiasi


altro tipo di puntatore
i n t a = 8;
i n t b ;
/ / Puntatore a i n t e r i
double c ; / / P u n t a t o r e a double
...
b = &a ;
c = ( double ) b ;

Che succede se ora dereferenzio c?

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Variabili puntatore
Aritmetica dei puntatori

Segmentation Fault!!! Perch?

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Variabili puntatore
Aritmetica dei puntatori

Violazione memoria con cast esplicito

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Variabili puntatore
Aritmetica dei puntatori

Violazione memoria con cast esplicito

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Variabili puntatore
Aritmetica dei puntatori

Violazione memoria con cast esplicito

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Organizzazione Memoria
Allocazione Dinamica della Memoria
Array bidimensionali

Outline
1

Puntatori
Variabili puntatore
Aritmetica dei puntatori

Allocazione della Memoria


Organizzazione Memoria
Allocazione Dinamica della Memoria
Array bidimensionali

Puntatori e funzioni
Passaggio per riferimento
Funzioni e Gestione Memoria

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Organizzazione Memoria
Allocazione Dinamica della Memoria
Array bidimensionali

Organizzazione Memoria
Lo Stack contiene i record di
attivazione delle funzioni (variabili
locali, temporanee, etc) che
vengono creati/distrutti
allingresso/uscita di una funzione

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Organizzazione Memoria
Allocazione Dinamica della Memoria
Array bidimensionali

Organizzazione Memoria
Lo Stack contiene i record di
attivazione delle funzioni (variabili
locali, temporanee, etc) che
vengono creati/distrutti
allingresso/uscita di una funzione
Lo Heap uno spazio di memoria
globale e persistente
Lallocazione e deallocazione di
questo spazio deve essere gestita
dal programmatore
Permette la creazione dinamica di
variabili la cui dimensione viene
determinata a tempo di esecuzione

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Evoluzione stack

int fact ( int n) {


i f ( n == 1 ) r e t u r n 1 ;
else r e t u r n n f a c t ( n 1) ;
}
i n t min ( i n t a , i n t b ) {
i n t m;
i f (a < b) m = a;
else m = b ;
r e t u r n m;
}
i n t main ( ) {
i n t n = 10 , m = 3 , x ;
x = min ( n , m) ;
x = fact (x) ;
}

Organizzazione Memoria
Allocazione Dinamica della Memoria
Array bidimensionali

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Evoluzione stack

int fact ( int n) {


i f ( n == 1 ) r e t u r n 1 ;
else r e t u r n n f a c t ( n 1) ;
}
i n t min ( i n t a , i n t b ) {
i n t m;
i f (a < b) m = a;
else m = b ;
r e t u r n m;
}
i n t main ( ) {
i n t n = 10 , m = 3 , x ;
x = min ( n , m) ;
x = fact (x) ;
}

Organizzazione Memoria
Allocazione Dinamica della Memoria
Array bidimensionali

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Evoluzione stack

int fact ( int n) {


i f ( n == 1 ) r e t u r n 1 ;
else r e t u r n n f a c t ( n 1) ;
}
i n t min ( i n t a , i n t b ) {
i n t m;
i f (a < b) m = a;
else m = b ;
r e t u r n m;
}
i n t main ( ) {
i n t n = 10 , m = 3 , x ;
x = min ( n , m) ;
x = fact (x) ;
}

Organizzazione Memoria
Allocazione Dinamica della Memoria
Array bidimensionali

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Evoluzione stack

int fact ( int n) {


i f ( n == 1 ) r e t u r n 1 ;
else r e t u r n n f a c t ( n 1) ;
}
i n t min ( i n t a , i n t b ) {
i n t m;
i f (a < b) m = a;
else m = b ;
r e t u r n m;
}
i n t main ( ) {
i n t n = 10 , m = 3 , x ;
x = min ( n , m) ;
x = fact (x) ;
}

Organizzazione Memoria
Allocazione Dinamica della Memoria
Array bidimensionali

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Evoluzione stack

int fact ( int n) {


i f ( n == 1 ) r e t u r n 1 ;
else r e t u r n n f a c t ( n 1) ;
}
i n t min ( i n t a , i n t b ) {
i n t m;
i f (a < b) m = a;
else m = b ;
r e t u r n m;
}
i n t main ( ) {
i n t n = 10 , m = 3 , x ;
x = min ( n , m) ;
x = fact (x) ;
}

Organizzazione Memoria
Allocazione Dinamica della Memoria
Array bidimensionali

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Evoluzione stack

int fact ( int n) {


i f ( n == 1 ) r e t u r n 1 ;
else r e t u r n n f a c t ( n 1) ;
}
i n t min ( i n t a , i n t b ) {
i n t m;
i f (a < b) m = a;
else m = b ;
r e t u r n m;
}
i n t main ( ) {
i n t n = 10 , m = 3 , x ;
x = min ( n , m) ;
x = fact (x) ;
}

Organizzazione Memoria
Allocazione Dinamica della Memoria
Array bidimensionali

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Evoluzione stack

int fact ( int n) {


i f ( n == 1 ) r e t u r n 1 ;
else r e t u r n n f a c t ( n 1) ;
}
i n t min ( i n t a , i n t b ) {
i n t m;
i f (a < b) m = a;
else m = b ;
r e t u r n m;
}
i n t main ( ) {
i n t n = 10 , m = 3 , x ;
x = min ( n , m) ;
x = fact (x) ;
}

Organizzazione Memoria
Allocazione Dinamica della Memoria
Array bidimensionali

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Evoluzione stack

int fact ( int n) {


i f ( n == 1 ) r e t u r n 1 ;
else r e t u r n n f a c t ( n 1) ;
}
i n t min ( i n t a , i n t b ) {
i n t m;
i f (a < b) m = a;
else m = b ;
r e t u r n m;
}
i n t main ( ) {
i n t n = 10 , m = 3 , x ;
x = min ( n , m) ;
x = fact (x) ;
}

Organizzazione Memoria
Allocazione Dinamica della Memoria
Array bidimensionali

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Evoluzione stack

int fact ( int n) {


i f ( n == 1 ) r e t u r n 1 ;
else r e t u r n n f a c t ( n 1) ;
}
i n t min ( i n t a , i n t b ) {
i n t m;
i f (a < b) m = a;
else m = b ;
r e t u r n m;
}
i n t main ( ) {
i n t n = 10 , m = 3 , x ;
x = min ( n , m) ;
x = fact (x) ;
}

Organizzazione Memoria
Allocazione Dinamica della Memoria
Array bidimensionali

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Evoluzione stack

int fact ( int n) {


i f ( n == 1 ) r e t u r n 1 ;
else r e t u r n n f a c t ( n 1) ;
}
i n t min ( i n t a , i n t b ) {
i n t m;
i f (a < b) m = a;
else m = b ;
r e t u r n m;
}
i n t main ( ) {
i n t n = 10 , m = 3 , x ;
x = min ( n , m) ;
x = fact (x) ;
}

Organizzazione Memoria
Allocazione Dinamica della Memoria
Array bidimensionali

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Evoluzione stack

int fact ( int n) {


i f ( n == 1 ) r e t u r n 1 ;
else r e t u r n n f a c t ( n 1) ;
}
i n t min ( i n t a , i n t b ) {
i n t m;
i f (a < b) m = a;
else m = b ;
r e t u r n m;
}
i n t main ( ) {
i n t n = 10 , m = 3 , x ;
x = min ( n , m) ;
x = fact (x) ;
}

Organizzazione Memoria
Allocazione Dinamica della Memoria
Array bidimensionali

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Evoluzione stack

int fact ( int n) {


i f ( n == 1 ) r e t u r n 1 ;
else r e t u r n n f a c t ( n 1) ;
}
i n t min ( i n t a , i n t b ) {
i n t m;
i f (a < b) m = a;
else m = b ;
r e t u r n m;
}
i n t main ( ) {
i n t n = 10 , m = 3 , x ;
x = min ( n , m) ;
x = fact (x) ;
}

Organizzazione Memoria
Allocazione Dinamica della Memoria
Array bidimensionali

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Organizzazione Memoria
Allocazione Dinamica della Memoria
Array bidimensionali

Primitive

Il C mette a disposizione delle primitive per la gestione


dinamica della memoria
Incluse in stdlib.h
Primitive per allocare dinamicamente variabili e array di
dimensione non nota a priori
malloc, calloc, realloc
Allocano porzioni contigue della memoria

free - primitiva di deallocazione della memoria

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Organizzazione Memoria
Allocazione Dinamica della Memoria
Array bidimensionali

Primitive - malloc

void * malloc(size_t size)

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Organizzazione Memoria
Allocazione Dinamica della Memoria
Array bidimensionali

Primitive - malloc

void * malloc(size_t size)


Alloca size bytes di memoria
size_t semplicemente un tipo intero senza segno

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Organizzazione Memoria
Allocazione Dinamica della Memoria
Array bidimensionali

Primitive - malloc

void * malloc(size_t size)


Alloca size bytes di memoria
size_t semplicemente un tipo intero senza segno

Restituisce un puntatore allinizio dellarea di memoria


allocata
void* definisce un puntatore ad un tipo generico che pu
essere castato implicitamente od esplicitamente a qualsisi
tipo puntatore
Se lallocazione di memoria fallisce, malloc restituisce
NULL

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Organizzazione Memoria
Allocazione Dinamica della Memoria
Array bidimensionali

Allocazione Dinamica Array (I)


Come creo dinamicamente un array di interi la cui dimensione
N viene immessa da tastiera?

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Organizzazione Memoria
Allocazione Dinamica della Memoria
Array bidimensionali

Allocazione Dinamica Array (I)


Come creo dinamicamente un array di interi la cui dimensione
N viene immessa da tastiera?
i n t N; / / dimensione a r r a y
i n t p t r ; / / P u n t a t o r e a l primo elemento d e l l a r r a y
/ / Leggo i l v a l o r e d e l l a r r a y da t a s t i e r a
p r i n t f ( " Immettere l a dimensione d e l l a r r a y " ) ;
s c a n f ( "%d " ,&N) ;
/ / A l l o c o dinamicamente l a r r a y
p t r = m a l l o c (N s i z e o f ( i n t ) ) ; / / Spazio per N i n t e r i
/ / C o n t r o l l o che l a l l o c a z i o n e s i a andata a buon f i n e
i f ( p t r ! = NULL ) {
/ / Siamo f e l i c i
} else {
/ / Gestione f a l l i m e n t o a l l o c a z i o n e
}

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Organizzazione Memoria
Allocazione Dinamica della Memoria
Array bidimensionali

Allocazione Dinamica Array (II)


Un array allocato dinamicamente pu essere trattato come un
array statico

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Organizzazione Memoria
Allocazione Dinamica della Memoria
Array bidimensionali

Allocazione Dinamica Array (II)


Un array allocato dinamicamente pu essere trattato come un
array statico
...
/ / A l l o c o dinamicamente l a r r a y
p t r = m a l l o c (N s i z e o f ( i n t ) ) ; / / Spazio per N i n t e r i
/ / C o n t r o l l o che l a l l o c a z i o n e s i a andata a buon f i n e
i f ( p t r ! = NULL ) {
f o r ( i =0; i <N ; i ++) {
p r i n t f ( " Immettere i l v a l o r e d e l l a p o s i z i o n e %d
d e l l array " , i ) ;
s c a n f ( "%d " , ( p t r + i ) ) ;
p r i n t f ( " Hai i n s e r i t o i l v a l o r e %d " , p t r [ i ] ) ;
}
}

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Organizzazione Memoria
Allocazione Dinamica della Memoria
Array bidimensionali

Primitive - calloc
Che assunzioni possiamo fare sul contenuto della memoria
appena allocata con malloc?

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Organizzazione Memoria
Allocazione Dinamica della Memoria
Array bidimensionali

Primitive - calloc
Che assunzioni possiamo fare sul contenuto della memoria
appena allocata con malloc?
Nessuna, come nel caso della dichiarazione di una variabile
non inizializzata. Per, esiste la funzione
void * calloc(size_t num, size_t size)

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Organizzazione Memoria
Allocazione Dinamica della Memoria
Array bidimensionali

Primitive - calloc
Che assunzioni possiamo fare sul contenuto della memoria
appena allocata con malloc?
Nessuna, come nel caso della dichiarazione di una variabile
non inizializzata. Per, esiste la funzione
void * calloc(size_t num, size_t size)
Alloca dinamicamente num elementi di dimensione size
(in bytes) e li inizializza a 0, e.g.
/ / Alloca N i n t e r i i n i z i a l i z z a t i a 0
i n t p t r = ( i n t ) c a l l o c (N, s i z e o f ( i n t ) ) ;

Restituisce NULL in caso di fallimento dellallocazione

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Organizzazione Memoria
Allocazione Dinamica della Memoria
Array bidimensionali

Primitive - realloc
Che succede se mi accorgo che larray allocato troppo
piccolo e voglio ingrandirlo dinamicamente senza perdere le
informazioni memorizzate?

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Organizzazione Memoria
Allocazione Dinamica della Memoria
Array bidimensionali

Primitive - realloc
Che succede se mi accorgo che larray allocato troppo
piccolo e voglio ingrandirlo dinamicamente senza perdere le
informazioni memorizzate?
void * realloc(void *ptr, size_t size)
ptr un puntatore ad unarea di memoria
precedentemente allocata
size la nuova dimensione (in bytes) dellarea di
memoria
Restituisce il puntatore al primo elemento dellarray
ridimensionato o NULL

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Organizzazione Memoria
Allocazione Dinamica della Memoria
Array bidimensionali

Dangling (Wild) Pointers


E possibile che il blocco di memoria ridimensionato da una
realloc venga allocato in una differente posizione dello heap.
Il contenuto della precedente area di memoria viene spostato
dalla realloc. Per...

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Organizzazione Memoria
Allocazione Dinamica della Memoria
Array bidimensionali

Dangling (Wild) Pointers


E possibile che il blocco di memoria ridimensionato da una
realloc venga allocato in una differente posizione dello heap.
Il contenuto della precedente area di memoria viene spostato
dalla realloc. Per...
i n t p t r 1 = ( i n t ) malloc (5 s i z e o f ( i n t ) ) ;
i n t ptr2 ;
...
p t r 2 = ( i n t ) r e a l l o c ( p t r 1 ,10 s i z e o f ( i n t ) ) ;

Che succede a ptr1?

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Organizzazione Memoria
Allocazione Dinamica della Memoria
Array bidimensionali

Dangling (Wild) Pointers


E possibile che il blocco di memoria ridimensionato da una
realloc venga allocato in una differente posizione dello heap.
Il contenuto della precedente area di memoria viene spostato
dalla realloc. Per...
i n t p t r 1 = ( i n t ) malloc (5 s i z e o f ( i n t ) ) ;
i n t ptr2 ;
...
p t r 2 = ( i n t ) r e a l l o c ( p t r 1 ,10 s i z e o f ( i n t ) ) ;

Che succede a ptr1?


ptr1 punta allarea di memoria pre-realloc, che potrebbe
non essere pi valida a causa dello spostamento. Quindi, se lo
usate...

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Segmentation Fault

Organizzazione Memoria
Allocazione Dinamica della Memoria
Array bidimensionali

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Organizzazione Memoria
Allocazione Dinamica della Memoria
Array bidimensionali

realloc tip

E buona norma memorizzare il puntatore restituito dalla


realloc in una variabile diversa da quella che punta allarea
di memoria da ridimensionare, e.g. vedi ptr1 e ptr2 qui sotto
i n t p t r 1 = ( i n t ) malloc (5 s i z e o f ( i n t ) ) ;
i n t ptr2 ;
...
p t r 2 = ( i n t ) r e a l l o c ( p t r 1 ,10 s i z e o f ( i n t ) ) ;

Perch?

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Organizzazione Memoria
Allocazione Dinamica della Memoria
Array bidimensionali

realloc tip

E buona norma memorizzare il puntatore restituito dalla


realloc in una variabile diversa da quella che punta allarea
di memoria da ridimensionare, e.g. vedi ptr1 e ptr2 qui sotto
i n t p t r 1 = ( i n t ) malloc (5 s i z e o f ( i n t ) ) ;
i n t ptr2 ;
...
p t r 2 = ( i n t ) r e a l l o c ( p t r 1 ,10 s i z e o f ( i n t ) ) ;

Perch?
Perch usando il solo puntatore ptr1, in caso di fallimento
della reallocazione della memoria, verrebbe sovrascritto da
NULL!

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Organizzazione Memoria
Allocazione Dinamica della Memoria
Array bidimensionali

Primitive - free
In C, la gestione dello heap lasciata al programmatore
Lo spazio allocato sullo heap non viene deallocato
alluscita delle funzioni
La deallocazione deve essere gestita esplicitamente

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Organizzazione Memoria
Allocazione Dinamica della Memoria
Array bidimensionali

Primitive - free
In C, la gestione dello heap lasciata al programmatore
Lo spazio allocato sullo heap non viene deallocato
alluscita delle funzioni
La deallocazione deve essere gestita esplicitamente
void free(void *ptr)

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Organizzazione Memoria
Allocazione Dinamica della Memoria
Array bidimensionali

Primitive - free
In C, la gestione dello heap lasciata al programmatore
Lo spazio allocato sullo heap non viene deallocato
alluscita delle funzioni
La deallocazione deve essere gestita esplicitamente
void free(void *ptr)
Dealloca lo spazio puntato da ptr ed allocato usando malloc,
calloc o realloc
i n t p t r = ( i n t ) c a l l o c (N, s i z e o f ( i n t ) ) ;
...
free ( ptr ) ;

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Organizzazione Memoria
Allocazione Dinamica della Memoria
Array bidimensionali

Array Bidimensionali
Supponiamo di voler rappresentare una matrice A di
dimensione n m.

1 2 3 4
A3,4 = 2 4 6 8
3 6 9 12

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Organizzazione Memoria
Allocazione Dinamica della Memoria
Array bidimensionali

Array Bidimensionali
Supponiamo di voler rappresentare una matrice A di
dimensione n m.

1 2 3 4
A3,4 = 2 4 6 8
3 6 9 12
In C, pu essere rappresentata come un array
bidimensionale, ovvero un array di array. Per leggere o
scrivere elementi dellarray bidimensionale si usano due indici
(nel caso della matrice, riga e colonna).
i n t main ( ) {
int a[3][4];
a [ 2 ] [ 1 ] = 5 6 ; / / s c r i v i a m o i l v a l o r e 56 n e l l a
posizione 1 del terzo array .
}

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Organizzazione Memoria
Allocazione Dinamica della Memoria
Array bidimensionali

Array Bidimensionali - Statici...

Inizializzazione array:
int a[2][4]={{1,2,3,4},{2,4,6,8}}
a[0] il primo array
a[0][3] il quarto elemento del primo array

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Organizzazione Memoria
Allocazione Dinamica della Memoria
Array bidimensionali

Array Bidimensionali - Statici...

A3,3

1 0 2
= 2 0 6
0 0 9

i n t main ( ) {
i n t i , j , v =0;
int a [3][3] = {{1 ,0 ,2} ,{2 ,0 ,6} ,{0 ,0 ,9}};
a [ 2 ] [ 2 ] = 0;
f o r ( i =0; i <3; i ++)
f o r ( j =0; j <3; j ++)
v+=a [ i ] [ j ] ;
}

Che valore assume v alla fine del programma?

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Organizzazione Memoria
Allocazione Dinamica della Memoria
Array bidimensionali

Array Bidimensionali - ...e Dinamici


Come alloco dinamicamente un array bi-dimensionale di interi
in cui il numero di righe N e colonne M letto da tastiera?

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Organizzazione Memoria
Allocazione Dinamica della Memoria
Array bidimensionali

Array Bidimensionali - ...e Dinamici


Come alloco dinamicamente un array bi-dimensionale di interi
in cui il numero di righe N e colonne M letto da tastiera?

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Organizzazione Memoria
Allocazione Dinamica della Memoria
Array bidimensionali

Array Bidimensionali - ...e Dinamici


Come alloco dinamicamente un array bi-dimensionale di interi
in cui il numero di righe N e colonne M letto da tastiera?

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Organizzazione Memoria
Allocazione Dinamica della Memoria
Array bidimensionali

Array Bidimensionali - ...e Dinamici


Come alloco dinamicamente un array bi-dimensionale di interi
in cui il numero di righe N e colonne M letto da tastiera?

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Organizzazione Memoria
Allocazione Dinamica della Memoria
Array bidimensionali

Array Bidimensionali Dinamici


Dichiarare un array bi-dimensionale dinamico:
i n t A ;

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Organizzazione Memoria
Allocazione Dinamica della Memoria
Array bidimensionali

Array Bidimensionali Dinamici


Dichiarare un array bi-dimensionale dinamico:
i n t A ;

Allocare prima larray di N puntatori ad interi (righe)..


A = m a l l o c (N s i z e o f ( i n t ) ) ;

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Organizzazione Memoria
Allocazione Dinamica della Memoria
Array bidimensionali

Array Bidimensionali Dinamici


Dichiarare un array bi-dimensionale dinamico:
i n t A ;

Allocare prima larray di N puntatori ad interi (righe)..


A = m a l l o c (N s i z e o f ( i n t ) ) ;

..e poi ciascuno degli N array di interi di dimensione M


f o r ( i =0; i <N; i ++) A [ i ] = m a l l o c (M s i z e o f ( i n t ) ) ;

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Organizzazione Memoria
Allocazione Dinamica della Memoria
Array bidimensionali

Array Bidimensionali Dinamici


Dichiarare un array bi-dimensionale dinamico:
i n t A ;

Allocare prima larray di N puntatori ad interi (righe)..


A = m a l l o c (N s i z e o f ( i n t ) ) ;

..e poi ciascuno degli N array di interi di dimensione M


f o r ( i =0; i <N; i ++) A [ i ] = m a l l o c (M s i z e o f ( i n t ) ) ;

Anche luso delle primitive calloc, realloc e free si


estende agli array bi-dimensionali

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Organizzazione Memoria
Allocazione Dinamica della Memoria
Array bidimensionali

Array n-dimensionali

Gli array, in generale, possono avere n dimensioni


i n t main ( ) {
int a[3][10][4][2];
a [ 0 ] [ 1 ] [ 3 ] [ 1 ] = 5;
}

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Organizzazione Memoria
Allocazione Dinamica della Memoria
Array bidimensionali

Array n-dimensionali

Gli array, in generale, possono avere n dimensioni


i n t main ( ) {
int a[3][10][4][2];
a [ 0 ] [ 1 ] [ 3 ] [ 1 ] = 5;
}

Quale valore scriviamo? a un array di array di array di array


di interi. La cella di memoria in cui si scrive il valore 5 quella
che si trova, a partire da a, scegliendo il primo array, poi il
secondo, poi lultimo, e infine lultimo elemento.

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Passaggio per riferimento


Funzioni e Gestione Memoria

Outline
1

Puntatori
Variabili puntatore
Aritmetica dei puntatori

Allocazione della Memoria


Organizzazione Memoria
Allocazione Dinamica della Memoria
Array bidimensionali

Puntatori e funzioni
Passaggio per riferimento
Funzioni e Gestione Memoria

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Passaggio per riferimento


Funzioni e Gestione Memoria

Passaggio dei parametri - Valore


I parametri delle funzioni C sono generalmente passati per
valore
Il loro valore viene copiato sullo stack
Ogni modifica del parametro nel corpo della funzione non
modifica loriginale

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Passaggio per riferimento


Funzioni e Gestione Memoria

Passaggio dei parametri - Valore


I parametri delle funzioni C sono generalmente passati per
valore
Il loro valore viene copiato sullo stack
Ogni modifica del parametro nel corpo della funzione non
modifica loriginale
v o i d swap ( i n t a , i n t b ) {
int c = a;
a = b;
b = c;
}
v o i d main ( ) {
...
swap ( x , y ) ;
}

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Passaggio per riferimento


Funzioni e Gestione Memoria

Passaggio dei parametri - Valore


I parametri delle funzioni C sono generalmente passati per
valore
Il loro valore viene copiato sullo stack
Ogni modifica del parametro nel corpo della funzione non
modifica loriginale
v o i d swap ( i n t a , i n t b ) {
int c = a;
a = b;
b = c;
}
v o i d main ( ) {
...
swap ( x , y ) ;
}

swap non scambia il contenuto di x,y perch lo scambio viene


fatto sulle copie!

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Passaggio per riferimento


Funzioni e Gestione Memoria

Passaggio per Riferimento


Possiamo sfruttare i puntatori per realizzare una versione
funzionante di swap (passaggio per riferimento)

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Passaggio per riferimento


Funzioni e Gestione Memoria

Passaggio per Riferimento


Possiamo sfruttare i puntatori per realizzare una versione
funzionante di swap (passaggio per riferimento)
v o i d swap ( i n t a , i n t b ) {
i n t c = a ;
a = b ;
b = c ;
}
v o i d main ( ) {
...
swap(& x ,& y ) ;
}

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Passaggio per riferimento


Funzioni e Gestione Memoria

Passaggio per Riferimento


Possiamo sfruttare i puntatori per realizzare una versione
funzionante di swap (passaggio per riferimento)
v o i d swap ( i n t a , i n t b ) {
i n t c = a ;
a = b ;
b = c ;
}
v o i d main ( ) {
...
swap(& x ,& y ) ;
}

Nello stack viene copiato lindirizzo di memoria di x e y.


Le modifiche eseguite da swap vengono fatte andando a
scrivere nellindirizzo di memoria di x e y e sono quindi
disponibili alluscita della funzione.

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Passaggio per riferimento


Funzioni e Gestione Memoria

Passaggio per Riferimento - Array


Attenzione! Gli array sono sempre passati per riferimento

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Passaggio per riferimento


Funzioni e Gestione Memoria

Passaggio per Riferimento - Array


Attenzione! Gli array sono sempre passati per riferimento
Si passa il nome dellarray, che un puntatore al primo
elemento
Ogni modifica ad elementi dellarray eseguita nel corpo di
una funzione modifica anche loriginale

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Passaggio per riferimento


Funzioni e Gestione Memoria

Passaggio per Riferimento - Array


Attenzione! Gli array sono sempre passati per riferimento
Si passa il nome dellarray, che un puntatore al primo
elemento
Ogni modifica ad elementi dellarray eseguita nel corpo di
una funzione modifica anche loriginale
Le segnature
void arrayFun(int x[])
void arrayFun(int *x)
sono del tutto equivalenti (tipicamente si usa la prima per
leggibilit)

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Passaggio per riferimento


Funzioni e Gestione Memoria

Funzioni e gestione della memoria

Ci sono alcuni aspetti critici da tenere in considerazione


nella gestione delle variabili locali alle funzioni
Memory leaks - cattiva gestione dellallocazione
dinamica
Persistenza delle variabili alluscita delle funzioni

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Passaggio per riferimento


Funzioni e Gestione Memoria

Memory Leaks (I)

Cosa c che non va in questo codice?


v o i d f o o ( i n t N) {
i n t a r r = ( i n t ) c a l l o c (N, s i z e o f ( i n t ) ) ;
i f ( a r r ! = NULL ) p r i n t f ( "%d \ n " , a r r [ 0 ] ) ;
}

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Passaggio per riferimento


Funzioni e Gestione Memoria

Memory Leaks (I)

Cosa c che non va in questo codice?


v o i d f o o ( i n t N) {
i n t a r r = ( i n t ) c a l l o c (N, s i z e o f ( i n t ) ) ;
i f ( a r r ! = NULL ) p r i n t f ( "%d \ n " , a r r [ 0 ] ) ;
}

Non viene eseguita la free(arr) prima delluscita da foo()

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Passaggio per riferimento


Funzioni e Gestione Memoria

Memory Leaks (I)

Cosa c che non va in questo codice?


v o i d f o o ( i n t N) {
i n t a r r = ( i n t ) c a l l o c (N, s i z e o f ( i n t ) ) ;
i f ( a r r ! = NULL ) p r i n t f ( "%d \ n " , a r r [ 0 ] ) ;
}

Non viene eseguita la free(arr) prima delluscita da foo()


Memory Leak - La memoria rimane allocata senza che ci sia un
puntatore ad indirizzarla

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Passaggio per riferimento


Funzioni e Gestione Memoria

Memory Leaks (II)

Ricordarsi di liberare sempre la memoria allocata


dinamicamente che non viene pi puntata
v o i d f o o ( i n t N) {
i n t a r r = ( i n t ) c a l l o c (N, s i z e o f ( i n t ) ) ;
i f ( a r r ! = NULL ) p r i n t f ( "%d \ n " , a r r [ 0 ] ) ;
free ( arr ) ;
}

Versione senza memory leak

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Passaggio per riferimento


Funzioni e Gestione Memoria

Memory Leaks (III)


Cosa dite di questa versione della funzione foo?
void foo ( ) {
i n t arr [10] = {0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0};
i f ( a r r ! = NULL ) p r i n t f ( "%d \ n " , a r r [ 0 ] ) ;
free ( arr ) ;
}

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Passaggio per riferimento


Funzioni e Gestione Memoria

Memory Leaks (III)


Cosa dite di questa versione della funzione foo?
void foo ( ) {
i n t arr [10] = {0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0};
i f ( a r r ! = NULL ) p r i n t f ( "%d \ n " , a r r [ 0 ] ) ;
free ( arr ) ;
}

Errore! Stiamo liberando memoria non allocata


dinamicamente
arr si trova nello stack: viene eliminato alluscita della
funzione
Dobbiamo liberare solo la memoria nello heap

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Passaggio per riferimento


Funzioni e Gestione Memoria

Persistenza delle Variabili (I)

Che cosa c di sbagliato in questo codice?


i n t riempi_array ( ) {
int arr [ 5 ] ;
f o r ( i n t i = 0 ; i <5; i ++) a r r [ i ] = i ;
return arr ;
}
v o i d main ( ) {
i n t a = riempi_array ( ) ;
p r i n t f ( "%d " , ( a ) ) ;
}

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Passaggio per riferimento


Funzioni e Gestione Memoria

Persistenza delle Variabili (I)

Che cosa c di sbagliato in questo codice?


i n t riempi_array ( ) {
int arr [ 5 ] ;
f o r ( i n t i = 0 ; i <5; i ++) a r r [ i ] = i ;
return arr ;
}
v o i d main ( ) {
i n t a = riempi_array ( ) ;
p r i n t f ( "%d " , ( a ) ) ;
}

Lo spazio allocato per arr viene deallocato alluscita, quindi a


un puntatore non valido

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Passaggio per riferimento


Funzioni e Gestione Memoria

Persistenza delle Variabili (II)


Come scrivere il codice precedente in modo corretto?

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Passaggio per riferimento


Funzioni e Gestione Memoria

Persistenza delle Variabili (II)


Come scrivere il codice precedente in modo corretto?
i n t r i e m p i _ a r r a y ( i n t N) {
int arr ;
a r r = m a l l o c (N s i z e o f ( i n t ) ) ;
f o r ( i n t i = 0 ; i <N; i ++) a r r [ i ] = i ;
return arr ;
}
v o i d main ( ) {
i n t N = 5;
i n t a = r i e m p i _ a r r a y (N) ;
p r i n t f ( "%d " , ( a ) ) ;
free (a) ;
}

Puntatori
Allocazione della Memoria
Puntatori e funzioni

Passaggio per riferimento


Funzioni e Gestione Memoria

Persistenza delle Variabili (II)


Come scrivere il codice precedente in modo corretto?
i n t r i e m p i _ a r r a y ( i n t N) {
int arr ;
a r r = m a l l o c (N s i z e o f ( i n t ) ) ;
f o r ( i n t i = 0 ; i <N; i ++) a r r [ i ] = i ;
return arr ;
}
v o i d main ( ) {
i n t N = 5;
i n t a = r i e m p i _ a r r a y (N) ;
p r i n t f ( "%d " , ( a ) ) ;
free (a) ;
}

a ora punta ad unarea di memoria nello heap, che non viene


deallocata alluscita da riempi_array