MEMORIA
variabili viste sino ad
ora:
hanno associato un
nome
hanno una portata
(la memoria in cui vengono allocate ha una struttura a pila)
la loro vita
dipende dal codice
sono risultato
solo di dichiarazioni e non di comandi (non esistono comandi che
restituiscano nuove variabili)
non posso
dichiarare variabili di dimensioni arbitrarie
sono tutte
caratteristiche della memoria di tipo stack = statica = a
pila:
heap (mucchio) =
altra parte di memoria con variabili con diverse caratteristiche:
possono non avere
un nome
la loro vita è
indipendente dal codice (può essere determinata a tempo di
esecuzione)
sono risultato di
una computazione (di un comando)
stack = memoria
statica -> variabili statiche
heap = memoria
dinamica -> variabili dinamiche
ALLOCAZIONE DINAMICA DELLA MEMORIA
MALLOC
(memory allocation)
esegue:
riceve la dimensione
del tipo e restituisce un indirizzo
es.
void
main(){
int
x;
int
*y;
y
= (int*) malloc(sizeof(int));
x
= 7;
*y
= x + 1;
}
perchè dobbiamo
utilizzare il casting ? in stdio.h troviamo:
void
*malloc(int x);
void non significa in
questo caso nulla, bensì sta ad indicare che malloc può
restituire un puntatore di qualsiasi tipo
FREE
void free(indirizzo di
memoria);
si occupa di deallocare
le variabili allocate dinamicamente (dichiara riallocabile una
locazione di memoria)
void
main(){
int
x;
int
*y;
y
= (int*) malloc(sizeof(int));
x
= 7;
free(y);
// y è l'indirizzo di una certa variabile intera, non sto
deallocando
*y
= 4; // non posso farlo perchè cerco di utilizzare una
variabile che non esiste più
*y
= x + 1;
y
= &x;
free(y);
// non si può più fare perchè y contiene
l'indirizzo di una variabile statica
}
char
x;
char
*y;
char
**z;
x
= 'a';
y
= (char *) malloc(sizeof(char));
*y
= 'b';
z
= &y; // z è una variabile di tipo puntatore a puntatore a
carattere, e assegno a questo l'indirizzo di y
int
*x;
x
= (int *) malloc(sizeof(char));
se devo allocare una
stringa:
char
*c;
c
= (char *) malloc(3*sizeof(char));
meglio
utilizzare:
c
= (char *) calloc(3, sizeof(char));
posso applicare strcpy
anche per stringhe contenute nello heap
|