• Non ci sono risultati.

ALLOCAZIONE DINAMICA DELLA MEMORIA in C e C++ Gianfranco Ciaschetti

N/A
N/A
Protected

Academic year: 2022

Condividi "ALLOCAZIONE DINAMICA DELLA MEMORIA in C e C++ Gianfranco Ciaschetti"

Copied!
22
0
0

Testo completo

(1)

ALLOCAZIONE DINAMICA DELLA MEMORIA in C e C++

Gianfranco Ciaschetti

(2)

Permette di allocare memoria «quando ce n’è bisogno», con un’istruzione e non con una dichiarazione

Riserva spazio di memoria «senza un nome» ma se ne conosce l’indirizzo

Riserva spazio nella memoria heap e non nello stack

La memoria allocata dinamicamente resta allocata fino a che non viene esplicitamente deallocata con un’apposita istruzione

Si usa l’operatore «freccia» anziché l’operatore «punto» per accedere ai campi di un record dinamico

ALLOCAZIONE DINAMICA DELLA MEMORIA

(3)

istruzioni del linguaggio C ALLOCAZIONE DINAMICA

malloc calloc realloc

void* malloc (size_t n);

void* calloc (size_t b, size_t n);

void* realloc(void* p, size_t n);

(4)

istruzioni del linguaggio C

DEALLOCAZIONE DINAMICA

free

void free (void *);

(5)

malloc : alloca memoria senza inizializzazione ALLOCAZIONE DINAMICA

void* malloc (size_t n);

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

p = (int*) malloc (sizeof(int));

(6)

ALLOCAZIONE DINAMICA

ESEMPIO: alloca spazio per 100 interi e memorizza in p l’indirizzo della memoria allocata int *p;

p = (int*) malloc (1oo*sizeof(int));

cin >> *p; // input di p[0]

ESEMPIO: alloca spazio per 20 reali in singola precisione e memorizza in f l’indirizzo della memoria allocata

float *f;

f = (float*) malloc (2o*sizeof(float));

*(f+2) = 3.14; // assegna valore a f[2]

malloc : alloca memoria senza inizializzazione

(7)

ESEMPIO: alloca spazio per una stringa di 20 caratteri char *s;

s = (char*) malloc (20*sizeof(char));

cin >> s; // inserisci stringa nella memoria dinamica

ALLOCAZIONE DINAMICA

malloc : alloca memoria senza inizializzazione

ESEMPIO: alloca un record di tipo cane struct cane {

char nome[20];

char razza[20];

int eta;

};

cane *c = (cane*)malloc(sizeof(cane));

cin >> c->nome;

cin >> c->razza;

cin >> c->eta;

(8)

ESEMPIO: alloca un vettore di N elementi int N, *vet;

cout << "quanti elementi?";

cin >> N;

vet = (int*)malloc(N*sizeof(int)); // possibile solo a RUNTIME ...

free(vet);

ALLOCAZIONE DINAMICA

vettore dinamico con malloc

(9)

void free (void *);

ESEMPIO: dealloca spazio precedentemente allocato int *p = (int*)malloc(sizeof(int));

...

free(p);

DEALLOCAZIONE DINAMICA

free : dealloca memoria precedentemente allocata

ESEMPIO: dealloca spazio precedentemente allocato float *f;

f = (float*)malloc(sizeof(float));

...

free(f);

(10)

ESEMPIO: dealloca spazio precedentemente allocato char *s;

s = (char*)malloc(20);

...

free(s);

DEALLOCAZIONE DINAMICA

free : dealloca memoria precedentemente allocata

ESEMPIO: dealloca spazio precedentemente allocato struct cane {...};

cane *c = (cane*)malloc(sizeof(cane));

...

free(c);

(11)

calloc : alloca memoria con inizializzazione ALLOCAZIONE DINAMICA

void* calloc (size_t b, size_t n);

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

p = (int*) calloc (1, sizeof(int)); // *p = 0

(12)

ALLOCAZIONE DINAMICA

ESEMPIO: alloca spazio per 100 interi e memorizza in p l’indirizzo della memoria allocata int *p;

p = (int*) calloc (1oo,sizeof(int)); // *p=0; *(p+1)=0; ...

ESEMPIO: alloca spazio per 20 reali in singola precisione e memorizza in f l’indirizzo della memoria allocata

float *f;

p = (float*) calloc (20,sizeof(float)); // *f=0; *(f+1)=0; ...

calloc : alloca memoria con inizializzazione

(13)

ESEMPIO: alloca spazio per una stringa di 20 caratteri char *s;

s = (char*) calloc (20,sizeof(char)); // s = ""

ALLOCAZIONE DINAMICA

calloc : alloca memoria con inizializzazione

ESEMPIO: alloca un record di tipo cane struct cane {

char nome[20];

char razza[20];

int eta;

};

cane *c = (cane*)calloc(1,sizeof(cane));

cin >> c->nome;

cin >> c->razza;

cin >> c->eta;

(14)

ESEMPIO: alloca un vettore di N elementi int i, N, *vet;

cout << "quanti elementi?";

cin >> N;

vet = (int*)calloc(N,sizeof(int)); // possibile solo a RUNTIME for(i=0; i<N; i++)

cout << vet[i] << endl; // visualizza N valori nulli

ALLOCAZIONE DINAMICA

vettore dinamico con calloc

(15)

void free (void *);

COME PER MALLOC!

DEALLOCAZIONE DINAMICA

free : dealloca memoria precedentemente allocata

ESEMPIO:

float *f;

f = (float*)calloc(1,sizeof(float));

...

free(f);

(16)

realloc : rialloca memoria senza inizializzazione RIALLOCAZIONE DINAMICA

void* realloc (void* p, size_t n);

ESEMPIO: rialloca spazio per due interi int *p;

p = (int*) malloc (sizeof(int)); // *p memorizza un intero ...

p = (int*)realloc(p, 2*sizeof(int));

// *p e *(p+1) memorizzano interi

(17)

realloc : rialloca memoria senza inizializzazione RIALLOCAZIONE DINAMICA

ESEMPIO: rialloca spazio per due interi int *p;

p = (int*) malloc (sizeof(int)); // *p memorizza un intero

*p = 3;

p = (int*)realloc(p, 2*sizeof(int));

// *p e *(p+1) memorizzano interi ma solo p ha un valore p[1] = 5;

cout << p[0]; // visualizza 3 cout << p[1]; // visualizza 5

(18)

ridimensionamento di un vettore con realloc RIALLOCAZIONE DINAMICA

ESEMPIO: ampliare la dimensione di un array dinamico int *vet, N;

cout << "quanti elementi?";

cin >> N;

p = (int*) malloc (N*sizeof(int));

...

cout << "quanti elementi aggiungere?";

cin >> N2;

p = (int*)realloc(p, (N+N2)*sizeof(int));

// i primi N sono come prima

(19)

istruzioni del linguaggio C++

ALLOCAZIONE e DEALLOCAZIONE DINAMICA

new delete

void* new data_type;

void delete pointer;

(20)

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

p = new int; // alloca memoria per un intero ...

delete p;

ALLOCAZIONE e DEALLOCAZIONE DINAMICA

in C++

(21)

ALLOCAZIONE e DEALLOCAZIONE DINAMICA in C++

ESEMPIO: alloca spazio per 20 interi e memorizza in p l’indirizzo della memoria allocata int *vet;

vet = new int[20]; // alloca memoria per un vettore ...

delete vet;

(22)

ALLOCAZIONE e DEALLOCAZIONE DINAMICA in C++

ESEMPIO: alloca un record di tipo cane struct cane {

char nome[20];

char razza[20];

int eta;

};

cane *c = new cane;

cin >> c->nome;

cin >> c->razza;

cin >> c->eta;

...

delete c;

Riferimenti

Documenti correlati

La somma degli angoli interni di un quadrilatero è sempre un angolo giro 2. Tutti i trapezi hanno una coppia di lati paralleli.. 5. Il quadrato è l’unico

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

consumatori devono alternarsi nel modo seguente: prima viene consumato un oggetto A, poi viene consumato un oggetto B, poi ancora un oggetto B, poi un oggetto A, e così via fino

Considerata l’imminenza delle iniziative ed attività, a valenza sportiva, ma anche culturale e turistica, legate al conferimento, da parte della Federazione

[r]

mazzariol e omizzolo associati. email studio.mazzariol.omizzolo@gmail.com

1:1.000 Sovrapposizione reti raccolta acque, sistemi di trattamento scarichi idrici al rilievo topografico. Susegana

Le acque di prima pioggia verranno raccolte nella vasca V9a.1 e nella nuova vasca V9a.2, successivamente saranno inviate al nuovo disoleatore D9c, a servizio delle due vasche, e poi