C. Gaibisso Programmazione di Calcolatori Lezione XVI Allocazione dinamica della memoria Programmazione di Calcolatori: allocazione dinamica della memoria.

Slides:



Advertisements
Presentazioni simili
Puntatori Linguaggio C.
Advertisements

Puntatori e gestione dinamica della RAM
Introduzione al linguaggio C
Puntatori in C e C++.
Fondamenti di Informatica I CDL in Ingegneria Elettronica - A.A CDL in Ingegneria Elettronica - A.A Strutture dati dinamiche.
Fondamenti di Informatica I CDL in Ingegneria Elettronica - A.A CDL in Ingegneria Elettronica - A.A Strutture dati dinamiche.
Differenze tra C e C++ Commenti: Adesso puoi inserire dei commenti tra // e la fine della linea. Usare le librerie C: In C++ puoi anche chiamare una funzione.
Mappare file in memoria
FUNZIONI DI BIBLIOTECA
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 Corso di Fondamenti di programmazione a.a. 2009/2010 Prof.ssa Chiara Petrioli.
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 Corso di Fondamenti di Programmazione a.a.2009/2010 Prof.ssa Chiara Petrioli Corso.
Laboratorio di Linguaggi lezione VI: puntatori 2/3 Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso.
Laboratorio di Linguaggi lezione V Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in.
Laboratorio di Linguaggi lezione V Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in.
Laboratorio di Linguaggi lezione VII: puntatori 3/3 Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso.
Laboratorio di Linguaggi lezione VIII B: Puntatori e Pasticci Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di.
Laboratorio di Linguaggi P R I M O C O M P I T I N O Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese.
Laboratorio di Linguaggi lezione IV Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in.
APPUNTI SUL LINGUAGGIO C
Argomenti Direttive di Preprocessore: Compilazione Condizionale
memoria gestita staticamente:
Organizzazione della Memoria (Unix) Text contiene le istruzioni in linguaggio macchina del codice eseguibile, può essere condiviso in caso di processi.
A.A. 2010/2011Ambienti di Programmazione per il Software di Base1 (Es. – 6) Ambienti di Programmazione per il Software di Base Le Stringhe in C Input.
1 Strutture Dinamiche Corso di Informatica A Vito Perrone.
Le liste dinamiche La ricorsione
Programmazione di Calcolatori
1 ListaDiElem Cancella( ListaDiElem lista, TipoElemento elem ) { ListaDiElem puntTemp; if( ! ListaVuota(lista) ) if( lista–>info == elem ) { puntTemp =
15 maggio 2002 Avvisi: Ultima lezione: mercoledì 29 maggio II Esonero: mercoledì 5 giugno, ora da stabilire.
Programmazione di Calcolatori
Programmazione di Calcolatori
G. Amodeo, C. Gaibisso Programmazione di Calcolatori Lezione VIII Il modello di memoria Programmazione di Calcolatori: Il modello di memoria 1.
C. Gaibisso Programmazione di Calcolatori Lezione VIII Il modello di memoria Programmazione di Calcolatori: Il modello di memoria 1.
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 Corso di Fondamenti di programmazione a.a. 2009/2010 Prof.ssa Chiara Petrioli.
G. Amodeo, C. Gaibisso Programmazione di Calcolatori Lezione XI Gli operatori Programmazione di Calcolatori: gli operatori 1.
G. Amodeo, C. Gaibisso Programmazione di Calcolatori Lezione X Ingresso/Uscita di Interi Programmazione di Calcolatori: Ingresso/Uscita 1.
Unità Didattica 3 Linguaggio C
Programmazione di Calcolatori
G. Amodeo, C. Gaibisso Programmazione di Calcolatori Lezione XVIII Le matrici Programmazione di Calcolatori: le matrici 1.
C. Gaibisso Programmazione di Calcolatori Lezione XIV I vettori Programmazione di Calcolatori: i vettori 1.
Programmazione di Calcolatori
C. Gaibisso Programmazione di Calcolatori Lezione XXII La struttura di dati lista di variabili strutturate Programmazione di Calcolatori: le liste di.
Complessità di un algoritmo
LdL - LP1 - lez 11 - ver 6 - aa Linguaggi di programmazione I Stringhe (II) Prof. Luigi Di Lascio Lezione 11.
Fondamenti di Informatica 2 Ingegneria Informatica Docente: Giovanni Macchia a.a
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Corso di Programmazione 1 a.a.2006/2007 Prof.ssa Chiara Petrioli Corso di Laurea.
Parte 3 Lo stato: variabili, espressioni ed assegnazioni
Fondamenti di Informatica 2 Ingegneria Informatica Docente: Giovanni Macchia a.a
1 Il linguaggio C Puntatori e dintorni. 2 Puntatori : idea di base In C è possibile conoscere e denotare l’indirizzo della cella di memoria in cui è memorizzata.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Array e “stringhe” Marco D. Santambrogio – Ver. aggiornata al 8 Aprile 2015.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Array e “stringhe” Marco D. Santambrogio – Ver. aggiornata al 26 Marzo 2014.
1 Il linguaggio C Precisazioni sull’esperienza in laboratorio.
Il linguaggio C Puntatori e dintorni.
Il linguaggio C Un primo programma C : un primo programma (2) /* Programma che calcola il massimo fra tre numeri inseriti da tastiera */ #include #define.
Informatica B Allievi Elettrici - AA Fondamenti della programmazione in linguaggio C (III)
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Array e “stringhe” Marco D. Santambrogio – Ver. aggiornata al 14 Marzo 204.
Puntatori in C Un puntatore è una variabile che contiene un indirizzo di memoria. Quando una variabile contiene l’indirizzo di un’altra variabile, si dice.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Array e “stringhe” Marco D. Santambrogio – Ver. aggiornata al 28 Ottobre 2014.
Linguaggio C: Funzioni e Puntatori Laboratorio di Programmazione Gruppo 1.
Programmazione e Laboratorio di Programmazione
Programmazione e Laboratorio di Programmazione
Programmazione e Laboratorio di Programmazione
APPUNTI SUL LINGUAGGIO C Allocazione dinamica della memoria
Programmazione e Laboratorio di Programmazione
Programmazione e Laboratorio di Programmazione
Programmazione e Laboratorio di Programmazione
Programmazione e Laboratorio di Programmazione
Programmazione e Laboratorio di Programmazione
Programmazione e Laboratorio di Programmazione
Programmazione e Laboratorio di Programmazione
Programmazione e Laboratorio di Programmazione
Transcript della presentazione:

C. Gaibisso Programmazione di Calcolatori Lezione XVI Allocazione dinamica della memoria Programmazione di Calcolatori: allocazione dinamica della memoria 1

C. Gaibisso Operatore sizeof() Programmazione di Calcolatori: allocazione dinamica della memoria2 Buffer: in questa lezione per buffer intenderemo una sequenza contigua di byte (locazioni) in memoria centrale Sintassi: sizeof(tipo_di_dato) con tipo_di_dato identificatore di tipo predefinito o non Valore: numero di byte utilizzati per rappresentare un valore di tipo tipo_di_dato

C. Gaibisso Operatore di casting Programmazione di Calcolatori: allocazione dinamica della memoria3 Sintassi: (tipo_di_dato) espressione con tipo_di_dato identificatore di tipo predefinito o non Valore: il valore di espressione convertito in un valore di tipo tipo_di_dato

C. Gaibisso Il tipo size_t Programmazione di Calcolatori: allocazione dinamica della memoria4 Definizione: typedef unsigned int size_t; utilizzato per rappresentare dimensioni Range di rappresentazione: tra 0 e 2 sizeof(size_t)*8 -1

C. Gaibisso Direttiva per il preprocessore Programmazione di Calcolatori: allocazione dinamica della memoria5 Attenzione!!! Le librerie del C mettono a disposizione del programmatore un insieme di funzioni per la gestione della memoria. Per utilizzare tali funzioni allinterno di un file è necessario includere in testa allo stesso la direttiva per il preprocessore: # include

C. Gaibisso La funzione malloc() Programmazione di Calcolatori: allocazione dinamica della memoria6 Signature (firma): void *malloc(size_t size); Modifiche allo stato della memoria: alloca un buffer di memoria di size byte Valore restituito: -lindirizzo del primo byte del buffer, in caso di successo -il valore NULL altrimenti

C. Gaibisso La funzione free() Programmazione di Calcolatori: allocazione dinamica della memoria7 Signature: void free(void *ptr); Modifiche allo stato della memoria: rilascia il buffer di memoria, di indirizzo iniziale ptr, allocato da una precedente chiamata alla malloc(), calloc() o realloc()

C. Gaibisso Le funzioni malloc() e free() Programmazione di Calcolatori: allocazione dinamica della memoria8 // sorgente: Lezione_XVI\malloc.c // illustra il corretto utilizzo dalla funzione malloc() e della free() // inclusione del file di intestazione della libreria standard che // contiene definizioni di macro, costanti e dichiarazioni di funzioni // e tipi funzionali alle varie operazioni di I/O #include // inclusione del file di intestazione della libreria standard che // contiene definizioni di macro, costanti e dichiarazioni di funzioni // di interesse generale #include // visualizza il contenuto di un buffer di interi void VisBuffInt(int *ptr, size_t nro_val) { // definisce la variabile necessaria a muoversi sul buffer size_t curs; // attraversa il buffer visualizzandone il contenuto for (curs = 0; curs <= dim-1; curs++) printf("\n%d", ptr[curs]); }; continua …

C. Gaibisso Le funzioni malloc() e free() Programmazione di Calcolatori: allocazione dinamica della memoria9 continua … // alloca, visualizza e successivamente rilascia, buffer per // un numero di valori interi specificato a run-time int main() { // definisce le variabili per il numero dei valori interi e per // lindirizzo iniziale del buffer size_t nro_val; int *ptr; // inizializza la variabile per il numero di valori printf("\nQuanti valori? "); scanf("%u", &nro_val); // alloca memoria per il buffer ptr = (int*) malloc(nro_val * sizeof(int)); continua …

C. Gaibisso Le funzioni malloc() e free() Programmazione di Calcolatori: allocazione dinamica della memoria10 continua … // se lallocazione e fallita termina if (ptr == NULL) { printf("\nAllocazione fallita"); return(0); }; // se l'allocazione è avvenuta con successo visualizza il contenuto // del buffer e rilascia la memoria per questo allocata printf("\nAllocazione avvenuta con successo\n"); printf(\nContenuto del buffer: ); VisBuffInt(ptr, nro_val); free(ptr); return(1); }

C. Gaibisso Le funzioni malloc() e free() Programmazione di Calcolatori: allocazione dinamica della memoria11 Compilazione: Esecuzione: Il buffer non viene inizializzato

C. Gaibisso La funzione calloc() Programmazione di Calcolatori: allocazione dinamica della memoria12 Signature: void *calloc(size_t nro_var, size_t dim_var); Modifiche allo stato della memoria: alloca un buffer di memoria per nro_var variabili di dimensione dim_var, e le inizializza a 0 Valore restituito: -lindirizzo del primo byte del buffer, in caso di successo -il valore NULL altrimenti

C. Gaibisso Le funzioni calloc() e free() Programmazione di Calcolatori: allocazione dinamica della memoria13 // sorgente: Lezione_XVI\calloc.c // illustra il corretto utilizzo dalla funzione calloc() e della free() // inclusione del file di intestazione della libreria standard che // contiene definizioni di macro, costanti e dichiarazioni di funzioni // e tipi funzionali alle varie operazioni di I/O #include // inclusione del file di intestazione della libreria standard che // contiene definizioni di macro, costanti e dichiarazioni di funzioni // di interesse generale #include // visualizza il contenuto di un buffer di interi void VisBuffInt(int *ptr, size_t dim) { // definisce la variabile necessaria a muoversi sul buffer size_t curs; // attraversa il buffer visualizzandone il contenuto for (curs = 0; curs <= dim-1; curs++) printf("\n%d", ptr[curs]); }; continua …

C. Gaibisso Le funzioni calloc() e free() Programmazione di Calcolatori: allocazione dinamica della memoria14 continua … // alloca, visualizza e successivamente rilascia, un buffer per // un numero di valori interi specificato a run-time int main() { // definisce le variabili per il numero dei valori interi e per // lindirizzo iniziale del buffer size_t nro_val; int *ptr; // inizializza la variabile per il numero di valori printf("\nQuanti valori? "); scanf("%u", &nro_val); // alloca e inizializza la memoria per il buffer ptr = (int*) calloc(nro_val, sizeof(int)); continua …

C. Gaibisso Le funzioni calloc() e free() Programmazione di Calcolatori: allocazione dinamica della memoria15 continua … // se lallocazione e fallita termina if (ptr == NULL) { printf("\nAllocazione fallita"); return(0) }; // se l'allocazione ha avuto successo visualizza il contenuto del // buffer e successivamente libera la memoria per questo allocata printf("\nAllocazione avvenuta con successo\n"); printf("\nContenuto del buffer:"); VisBuffIn(ptr, nro_val); free(ptr); return(1); }

C. Gaibisso Le funzioni calloc() e free() Programmazione di Calcolatori: allocazione dinamica della memoria16 Compilazione: Esecuzione: Il buffer è inizializzato a 0

C. Gaibisso La funzione realloc() Programmazione di Calcolatori: allocazione dinamica della memoria17 Signature: void *realloc(void * ptr, size_t size); Modifiche allo stato della memoria: estende, o nel caso comprime, il buffer riferito da ptr, mantenendo inalterato il contenuto della porzione preesistente, a meno di troncamenti. Gestisce automaticamente eventuali ricollocazioni del buffer. Valore restituito: -lindirizzo del primo byte del buffer, in caso di successo -il valore NULL altrimenti realloc(NULL, size): equivale a malloc(size)

C. Gaibisso void *ptr = realloc(NULL, 5); ptr = realloc(ptr, 8); … free(ptr); NULL La funzione realloc() e i memory leak Programmazione di Calcolatori: i vettori18 Memory leak: area di memoria allocata e non più accessibile non esistendo puntatori che la riferiscono 100 ptr x x x x x NULL Non ha alcun effetto

C. Gaibisso La funzione realloc() Programmazione di Calcolatori: i vettori19 ptr void *ptr, *tmp; ptr = realloc(NULL, 2); tmp = realloc(ptr, 4); // gestione dellerrore if (tmp == NULL) { printf (errore); free(ptr); return (0); } else ptr = tmp; …. free(ptr); tmp x x x x 100 x x x x 103 Lapproccio corretto:

C. Gaibisso La funzione realloc() Programmazione di Calcolatori: allocazione dinamica della memoria20 // sorgente: Lezione_XVI\realloc.c // illustra il corretto utilizzo dalla funzione realloc() // inclusione del file di intestazione della libreria standard che // contiene definizioni di macro, costanti e dichiarazioni di funzioni // e tipi funzionali alle varie operazioni di I/O #include // inclusione del file di intestazione della libreria standard che // contiene definizioni di macro, costanti e dichiarazioni di funzioni // di interesse generale #include // inizializza il contenuto di un buffer di interi con una sequenza // progressiva di interi void InBuffInt(int *ptr, size_t dim) { // definisce la variabile necessaria a muoversi sul buffer size_t curs; // attraversa il buffer visualizzandone il contenuto for (curs = 0; curs <= dim-1; curs++) ptr[curs] = curs; }; continua …

C. Gaibisso La funzione realloc() Programmazione di Calcolatori: allocazione dinamica della memoria21 continua … // visualizza il contenuto di un buffer di interi void VisBuffInt(int *ptr, size_t dim) { // definisce la variabile necessaria a muoversi sul buffer size_t curs; // attraversa il buffer visualizzandone il contenuto for (curs = 0; curs <= dim-1; curs++) printf("\n%d", ptr[curs]); }; // alloca, visualizza, ridimensiona, visualizza nuovamente e rilascia, un // buffer per un numero di valori interi specificato a run-time int main() { // definisce le variabili per il numero dei valori interi e per // il riferimento al buffer iniziale size_t nro_val; int *ptr; continua …

C. Gaibisso La funzione realloc() Programmazione di Calcolatori: allocazione dinamica della memoria22 continua … // definisce una variabile temporanea per il riferimento al buffer // ridimensionato, al fine di non perdere il riferimento al buffer // iniziale se il ridimensionamento fallisse int *tmp; // definisce una variabile per il numero di valori interi nel buffer // ridimensionato size_t new_nro_val; // inizializza la variabile per il numero di valori nel buffer iniziale printf("\nQuanti valori nel buffer iniziale? "); scanf("%u", &nro_val); // alloca memoria per il buffer iniziale ptr = (int *) realloc(NULL, nro_val*sizeof(int)); // se lallocazione è fallita termina if (ptr == NULL) { printf("\nAllocazione fallita"); return(0); }; continua …

C. Gaibisso La funzione realloc() Programmazione di Calcolatori: allocazione dinamica della memoria23 continua … // altrimenti, se l'allocazione ha avuto successo, inizializza e // visualizza il buffer iniziale printf("\nAllocazione avvenuta con successo\n"); InBuffInt(ptr, nro_val); printf("\nBuffer iniziale:\n"); VisBuffInt(ptr, nro_val); // inizializza la variabile per il numero di valori nel buffer // ridimensionato printf("\nQuanti valori nel buffer ridimensionato? "); scanf("%u", &new_nro_val); // ridimensiona il buffer iniziale tmp = (int *)realloc(ptr, new_nro_val); // verifica se il ridimensionamento è avvenuto con successo if (tmp == NULL) { // se il ridimensionamento e' fallito visualizza il buffer originale // e termina printf("\nAllocazione fallita); printf("\nBuffer iniziale:\n "); VisBuffInt(ptr, nro_val); }; continua …

C. Gaibisso La funzione realloc() Programmazione di Calcolatori: allocazione dinamica della memoria24 continua … // se il ridimensionamento e avvenuto con successo // aggiorna il riferimento al buffer ptr = tmp; // visualizza il contenuto del buffer ridimensionato printf("\nAllocazione avvenuta con successo); printf("\nBuffer ridimensionato:"); VisBuffInt(ptr, new_nro_val); // rilascia la memoria allocata per il buffer free(ptr); return(1); }

C. Gaibisso La funzione realloc() Programmazione di Calcolatori: allocazione dinamica della memoria25 Compilazione: Esecuzione:

C. Gaibisso La funzione realloc() e free() Programmazione di Calcolatori: allocazione dinamica della memoria26 Esecuzione:

C. Gaibisso Le funzioni calloc() e free() Programmazione di Calcolatori: allocazione dinamica della memoria27 Esecuzione:

C. Gaibisso La funzione memcpy() Programmazione di Calcolatori: allocazione dinamica della memoria28 Signature: void * memcpy(void * dest, void * src, int n) Modifiche allo stato della memoria: copia n byte dallindirizzo src allindirizzo dst Valore restituito: lindirizzo dest Direttive per il preprocessore: includere la direttiva #include per utilizzare la funzione

C. Gaibisso La funzione memcpy() Programmazione di Calcolatori: allocazione dinamica della memoria29 // sorgente: Lezione_XVI\memcpy.c // illustra il corretto utilizzo dalla funzione memcpy() // inclusione del file di intestazione della libreria standard // che contiene definizioni di macro, costanti e dichiarazioni // di funzioni e tipi funzionali alle varie operazioni di I/O #include // inclusione del file di intestazione della libreria standard che // contiene definizioni di macro,costanti e dichiarazioni di funzioni di // interesse generale, per la gestione della memoria e delle stringhe #include // inizializza il contenuto di un buffer di interi con una sequenza pro- // gressiva di interi void InBuffInt(int *ptr, size_t dim) { // definisce la variabile necessaria a muoversi sul buffer size_t curs; // attraversa il buffer visualizzandone il contenuto for (curs = 0; curs <= dim-1; curs++) ptr[curs] = curs; }; continua …

C. Gaibisso La funzione memcpy() Programmazione di Calcolatori: allocazione dinamica della memoria30 continua … // visualizza il contenuto di un buffer di interi void VisBuffInt(int *ptr, size_t dim) { // definisce la variabile necessaria a muoversi sul buffer size_t curs; // attraversa il buffer visualizzandone il contenuto for (curs = 0; curs <= dim-1; curs++) printf("\n%d", ptr[curs]); }; // alloca due buffer di interi, inizializza il I, lo visualizza e lo copia nel II. // Visualizza il contenuto del II e rilascia tutta la memoria allocata int main() { // definisce le variabili per il numero dei valori interi e per i // riferimenti ai due buffer size_t nro_val; int *ptr_1, *ptr_2; // inizializza la variabile per il numero di valori in entrambe i buffer printf("\nQuanti valori nei buffer? "); scanf("%u", &nro_val); continua …

C. Gaibisso La funzione memcpy() Programmazione di Calcolatori: allocazione dinamica della memoria31 continua … // alloca memoria per i due buffer ptr_1 = (int *) realloc(NULL,nro_val*sizeof(int)); ptr_2 = (int *) realloc(NULL,nro_val*sizeof(int)); // controlla se lallocazione è avvenuta con successo if ((ptr_1 == NULL) || (ptr_2 == NULL)) { // se lallocazione è fallita rilascia la memoria allocata // e termina printf("\nAllocazione fallita"); if (ptr_1 != NULL) free(ptr_1); if (ptr_2 != NULL) free(ptr_1); return(0); }; // altrimenti inizializza il I buffer e lo visualizza printf("\nAllocazione avvenuta con successo\n"); InBuffInt(ptr_1, nro_val); printf("\nContenuto I Buffer:"); VisBuffInt(ptr_1, nro_val); continua …

C. Gaibisso La funzione memcpy() Programmazione di Calcolatori: allocazione dinamica della memoria32 continua … // copia il I buffer nel II e lo visualizza ptr_2 = memcpy(ptr_2, ptr_1, nro_val*sizeof(int)); printf("\nContenuto II Buffer:"); VisBuffInt(ptr_2, nro_val); // rilascia la memoria per entrambe i buffer free(ptr_1); free(ptr_2); return(1); }

C. Gaibisso La funzione memcpy() Programmazione di Calcolatori: allocazione dinamica della memoria33 Compilazione: Esecuzione:

C. Gaibisso La funzione memcpy() Programmazione di Calcolatori: allocazione dinamica della memoria34 Esecuzione: