ALLOCAZIONE STATICA: LIMITI Per quanto sappiamo finora, in C le variabili sono sempre dichiarate staticamente –la loro esistenza deve essere prevista e.

Slides:



Advertisements
Presentazioni simili
Programmazione ad oggetti
Advertisements

Puntatori Linguaggio C.
Puntatori e gestione dinamica della RAM
Puntatori in C e C++.
© 2007 SEI-Società Editrice Internazionale, Apogeo Unità G1 Dati strutturati.
PUNTATORI Introduzione
Universita di Camerino
1 Strutture dati nel supporto a run time. 2 Entità presenti quando un programma va in esecuzione §programmi dutente (compilati) §routines del supporto.
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.
Fondamenti di Informatica Prof. Cantone
Indirizzi delle variabili A ogni variabile sono associati tre concetti fondamentali: il valore memorizzato; il tipo dati di appartenenza; lindirizzo. Il.
Fondamenti di Informatica II Ingegneria Informatica / Automatica (A-I) Meccanica Prof. M.T. PAZIENZA a.a – 3° ciclo.
Caratteri e stringhe di caratteri
Fondamenti di Informatica II Ingegneria Informatica (A-I) Prof. M.T. PAZIENZA a.a – 3° ciclo.
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 Corso di Fondamenti di programmazione a.a. 2009/2010 Prof.ssa Chiara Petrioli.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio – Ver. aggiornata al 21 Marzo 2013.
1 Programmazione ad oggetti in Java E.Mumolo, DEEI
Allocazione dinamica della memoria
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 VIII Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea.
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 IV 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 lezione IV Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in.
1 Corso di Laurea in Biotecnologie Informatica (Programmazione) Array Anno Accademico 2009/2010.
1 Corso di Informatica (Programmazione) Lezione 13 (21 novembre 2008) Programmazione in Java: stringhe e array.
Corso di Informatica Applicata Lezione 6
nome: sequenza di caratteri usata per denotare un oggetto
memoria gestita staticamente:
1 Strutture Dinamiche Corso di Informatica A Vito Perrone.
Esercizi Puntatori, struct con campi puntatore, puntatori a struct, rapporto tra array e puntatori. FUNZIONI Passaggio di parametri per indirizzo, passaggio.
Le funzioni.
Le funzioni a tempo di esecuzione
GESTIONE DEI FILE Per poter mantenere disponibili i dati tra le diverse esecuzioni di un programma (persi-stenza dei dati) è necessario poterli archi-viare.
PUNTATORI Un puntatore è una variabile destinata a contenere lindirizzo di unaltra variabile Vincolo di tipo: un puntatore a T può contenere solo lindirizzo.
FUNZIONI... Una funzione permette di dare un nome a una espressione rendendola parametrica float f(){ return * sin(0.75); } float f1(int x) { return.
Fondamenti di informatica Linguaggio C Main Program: Architettura di un PC Diagrammi di flusso Linguaggio C.
1 ListaDiElem Cancella( ListaDiElem lista, TipoElemento elem ) { ListaDiElem puntTemp; if( ! ListaVuota(lista) ) if( lista–>info == elem ) { puntTemp =
2000 Prentice Hall, Inc. All rights reserved. Capitolo 10 (Deitel) Strutture, unioni ed enumerazioni Sommario Introduzione Definire le strutture.
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 Corso di Fondamenti di programmazione a.a. 2009/2010 Prof.ssa Chiara Petrioli.
Unità Didattica 3 Linguaggio C
Laboratorio di Linguaggi lezione VII: variabili Globali e Locali Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali.
Passaggio di parametri per indirizzo
Fopndamenti di programmazione. 2 La classe String Una stringa è una sequenza di caratteri La classe String è utilizzata per memorizzare caratteri La classe.
Fondamenti di Informatica II Ingegneria Informatica / Automatica (A-I) Meccanica Prof. M.T. PAZIENZA a.a – 3° ciclo.
Fondamenti di Informatica 2 Ingegneria Informatica Docente: Giovanni Macchia a.a
1. 2 Variabili statiche e dinamiche Un programma è un processo in esecuzione a cui il sistema operativo assegna una certa zona di memoria. Tale zona può.
Vettori, indirizzi e puntatori Finora abbiamo usato gli indirizzi nel chiamare  la funzione scanf()  le altre funzioni per riferimento Tuttavia la vera.
Variabili Numeriche –Interi (byte, short, int, long): complemento a 2 –A virgola mobile (float, double): IEEE 745 Alfanumeriche –Carattere (char): Unicode.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio – Ver. aggiornata al 11 Ottobre 2014.
Università di Torino – Facoltà di Scienze MFN Corso di Studi in Informatica Programmazione I - corso B a.a prof. Viviana Bono Blocco 7 – Array.
Fondamenti di Informatica 2 Ingegneria Informatica Docente: Giovanni Macchia a.a
Fondamenti di Informatica II Ingegneria Informatica (A-I) Prof. M.T. PAZIENZA a.a – 3° ciclo.
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 Puntatori Marco D. Santambrogio – Ver. aggiornata al 11 Marzo 2014.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Array e “stringhe” Marco D. Santambrogio – Ver. aggiornata al 8 Aprile 2015.
Relazione sulle strutture dati Svolta da: Buccella Simone Strutture di dati Aree di memoria Puntatore numericibooleani alfabetici Statici dinamici Puntatori.
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.
1 Strutture dati. 2 Astrazione Non vogliamo sapere l’organizzazione fisica dei dati  indirizzi e celle di memoria Ci interessa solo la loro organizzazione.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio – Ver. aggiornata al 8 Aprile 2015.
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.
“ Pseudocodice ” Un programma per computer lavorerà su in insieme di “ variabili ” contenenti i dati del problema, soluzioni intermedie, soluzioni finali.
Introduzione alle Classi e agli Oggetti in Java 1.
13. Strutture dati dinamiche Ing. Simona Colucci Informatica - CDL in Ingegneria Industriale- A.A
Transcript della presentazione:

ALLOCAZIONE STATICA: LIMITI Per quanto sappiamo finora, in C le variabili sono sempre dichiarate staticamente –la loro esistenza deve essere prevista e dichiarata a priori –il loro nome dev’essere deciso a priori Mentre per le variabili di tipo scalare ciò non costituisce di norma un problema, può esserlo per variabili di tipo array, in cui dover specificare a priori le dimensioni (costanti!) è particolarmente limitativo.

ALLOCAZIONE STATICA: LIMITI In molte situazioni è impossibile sapere a priori le dimensioni dei dati di ingresso –e quindi non si sa come dimensionare l’array Sarebbe molto utile poter dimensionare un array “al volo”, dopo aver scoperto quanto grande deve essere. A questo fine si introduce il concetto di allocazione dinamica della memoria.

ALLOCAZIONE DINAMICA Per chiedere nuova memoria “al momento del bisogno” si usa una funzione di libreria che “gira” la richiesta al sistema operativo: la funzione di libreria malloc() La funzione malloc() :  chiede al sistema di allocare un’area di memoria grande tanti byte quanti ne desideriamo  restituisce l’indirizzo dell’area di memo- ria allocata

LA FUNZIONE malloc() La funzione malloc(size_t dim) :  chiede al sistema di allocare un’area di memoria grande dim byte  restituisce l’indirizzo dell’area di memoria allocata - o NULL se, per qualche motivo, l’allocazione non è stata possibile  è sempre opportuno controllare il risultato di malloc() prima di usare la memoria fornita  Il sistema operativo preleva la memoria richiesta dall’area heap

LA FUNZIONE malloc() Praticamente, occorre quindi:  specificare quanti byte si vogliono, come parametro passato a malloc()  mettere in un puntatore il risultato fornito da malloc() stessa Attenzione:  malloc() restituisce un puro indirizzo, ossia un puntatore “senza tipo”  per assegnarlo a uno specifico puntatore occorre un cast esplicito

ESEMPIO Per farsi dare 12 byte: int *p; p = (int*) malloc(12); Per farsi dare lo spazio necessario per 5 interi (qualunque esso sia): int *p; p = (int*) malloc(5*sizeof(int)); Troppo specifico! L’operatore sizeof consente di essere indipendenti dalle scelte dello specifico compilatore e della specifica macchina

ESEMPIO Allocazione: int *p; p = (int*) malloc(5*sizeof(int)); Risultato: Sono cinque celle adat- te a un int:  10 byte in TurboC  20 byte in Djgpp p

AREE DINAMICHE: USO L’area allocata è usabile, equivalentemente: o tramite la notazione a puntatore ( *p ) o tramite la notazione ad array ( [ ] ) int *p; p=(int*)malloc(5*sizeof(int)); p[0] = 13; p[1] = 18;... *(p+4) = -20; p Attenzione a non “sforare”! Non c’è alcun controllo!!

AREE DINAMICHE: USO L’area allocata è usabile, equivalentemente: o tramite la notazione a puntatore ( *p ) o tramite la notazione ad array ( [ ] ) int *p; p=(int*)malloc(5*sizeof(int)); p[0] = 13; p[1] = 18;... *(p+4) = -20; p Abbiamo costruito un array dinamico, le cui dimensioni:  non sono determinate a priori  possono essere scelte dal pro- gramma in base alle esigenze del momento. L’espressione passata a malloc() può infatti contenere variabili.

AREE DINAMICHE: DEALLOCAZIONE Quando non serve più, l’area allocata deve essere esplicitamente deallocata –ciò segnala al sistema operativo che quell’area è da considerare nuovamente disponibile per altri usi La deallocazione si effettua mediante la funzione di libreria free() int *p=(int*)malloc(5*sizeof(int));... free(p); Non è necessario specifica- re la dimensione del blocco da deallocare, perché il sistema la conosce già!

AREE DINAMICHE: TEMPO DI VITA Il tempo di vita di una variabile dinamica non è legato a quello delle funzioni –in particolare, non è legato al tempo di vita della funzione che l’ha creata quindi, una variabile dinamica può soprav- vivere alla funzione che l’ha creata Ciò consente di –creare un’area dinamica in una funzione... –... usarla in un’altra funzione... –... e distruggerla in una terza funzione!

ESERCIZIO 1 Creare un array di float di dimensione specificata dall’utente #include main(){ float *v; int n; printf("Dimensione: "); scanf("%d",&n); v = (float*) malloc(n*sizeof(float));... uso dell’array... free(v); } malloc() e free() sono dichiarate in stdlib.h

ESERCIZIO 2 Scrivere una funzione che, dato un intero, allochi e restituisca una stringa di caratteri della dimensione specificata #include char* alloca(int n){ return (char*) malloc(n*sizeof(char)); } NOTA: dentro alla funzione non deve compari- re la free(), in quanto scopo della funzione è proprio creare un array che sopravviva alla funzione stessa.

ESERCIZIO 2 - CONTROESEMPIO Scrivere una funzione che, dato un intero, allochi e restituisca una stringa di caratteri della dimensione specificata Questo invece sarebbe stato errato!! #include char* alloca(int n){ char v[n]; return v; } Perché è sbagliato? Dov'è l'errore?

ARRAY DINAMICI.. quanto? Un array ottenuto per allocazione dinamica è “dinamico” nel senso che le sue dimen- sioni possono essere decise al momento della creazione, e non per forza a priori. Non significa che l’array possa essere “espanso” secondo necessità: una volta creato, l’array ha dimensione fissa! Strutture dati espandibili dinamicamente secondo necessità esistono, ma non sono array (sono in primis liste e alberi).

DEALLOCAZIONE: NOTE Il modello di gestione della memoria dina- mica del C richiede che l'utente si faccia esplicitamente carico anche della dealloca- zione della memoria. È un approccio pericoloso: molti errori sono causati proprio da un’errata deallocazione! –rischio di puntatori che puntano ad aree di memoria non più esistenti  dangling reference Altri linguaggi gestiscono automaticamente la deallocazione, con un garbage collector.

DEALLOCAZIONE: NOTE Il modello di gestione della memoria dina- mica del C richiede che l'utente si faccia esplicitamente carico anche della dealloca- zione della memoria. È un approccio pericoloso: molti errori sono causati proprio da un’errata deallocazione! –rischio di puntatori che puntano ad aree di memoria non più esistenti  dangling reference Altri linguaggi gestiscono automaticamente la deallocazione, con un garbage collector. È dimostrato che l’uso di un garbage collector riduce drasticamente il numero di errori legati all’uso dei puntatori Però, il garbage collector è un’entità fuori dal nostro controllo, che parte “quando vuole lui”  inadatto ai sistemi “in tempo reale” (real time)