Allocazione dinamica della memoria

Documenti analoghi
Gestione dinamica della memoria

Strutture Dati Dinamiche

Allocazione dinamica della memoria

L'Allocazione Dinamica della Memoria nel linguaggio C

Ogni variabile in C è una astrazione di una cella di memoria a cui corrisponde un nome, un contenuto e un indirizzo.

! Per quanto sappiamo finora, in C le variabili sono sempre definite staticamente

L Allocazione Dinamica della Memoria

La gestione della memoria dinamica Heap

Unità Didattica 4 Linguaggio C. Vettori. Puntatori. Funzioni: passaggio di parametri per indirizzo.

Allocazione Dinamica. Allocazione Statica. malloc() La funzione malloc()

Il linguaggio C. Puntatori e dintorni

Introduzione al C. Unità Gestione Dinamica della Memoria

Allocazione dinamica della memoria: calloc() Se T è il nomed di un tipo, la chiamata calloc(n, sizeof(t)) è equivalente a malloc(n * sizeof(t))

Allocazione statica della memoria

Uso avanzato dei puntatori Allocazione dinamica della memoria

Definizione Allocazione e deallocazione di variabili Allocazione e deallocazione di vettori

L apertura di un file ci restituisce un puntatore a una struttura chiamata FILE fopen:

Informatica 1. Corso di Laurea Triennale in Matematica. Gianluca Rossi

C: panoramica. Violetta Lonati

Allocazione della memoria. Allocazione dinamica della memoria. Allocazione della memoria. Allocazione automatica

Puntatori. Un puntatore contiene un numero che indica la locazione di memoria dove è presente la variabile puntata

Allocazione dinamica della memoria - riepilogo

Corso di Fondamenti di Informatica. Puntatori e Allocazione Dinamica

Prof.Ing.S.Cavalieri Puntatori e Heap in Linguaggio C. Puntatori e Heap

Array multidimensionali e stringhe

Allocazione Dinamica della Memoria

Introduzione al C. Ancora puntatori, allocazione dinamica, e tipi derivati

L'allocazione dinamica della memoria

Puntatori. Unità 6. Domenico Daniele Bloisi. Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR

Le operazioni di allocazione e deallocazione sono a carico del sistema.

Primi passi col linguaggio C

Puntatori. Unità 6. Corso di Laboratorio di Informatica Ingegneria Clinica BCLR. Domenico Daniele Bloisi

Consideriamo un vettore allocato dinamicamente

Università degli Studi di Cassino e del Lazio Meridionale Corso di Fondamenti di Informatica Allocazione dinamica di memoria

Corso di Fondamenti di Informatica

Lezione 19 e Allocazione dinamica della memoria - Direttive al preprocessore - Libreria standard - Gestione delle stringhe

Il puntatore. Il puntatore

Struct, enum, Puntatori e Array dinamici

Il linguaggio C. Puntatori e Array

Fondamenti di Informatica T. Linguaggio C: i puntatori

Funzioni, Stack e Visibilità delle Variabili in C

I puntatori e l allocazione dinamica di memoria

File binari e file di testo

Il linguaggio C. Puntatori e dintorni

Calcolatori Elettronici Lezione A4 Programmazione a Moduli

Gli array. Gli array. Gli array. Classi di memorizzazione per array. Inizializzazione esplicita degli array. Array e puntatori

Mini-dispensa sui puntatori in C

Stringhe e allocazione dinamica della memoria

Esercizi di programmazione in linguaggio C English Dictionary

Tipi di dato personalizzati Array di struct. Tipi di dato utente. Laboratorio di Programmazione I. Corso di Laurea in Informatica A.A.

Programmazione (imperativa)

Laboratorio di Algoritmi e Strutture Dati. La gestione della memoria dinamica Heap

La Gestione della Memoria. Carla Binucci e Walter Didimo

Introduzione al linguaggio C Puntatori

Compendio sottoinsieme del C++ a comune col C. (Libreria standard, Input/Output, Costanti, Dichiarazioni e typedef, Memoria Dinamica)

GESTIONE DEI FILE IN C. Docente: Giorgio Giacinto AA 2008/2009

Array. Parte 7. Domenico Daniele Bloisi. Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR

Verso i puntatori: Cosa è una variabile?

Le strutture. Una struttura C è una collezione di variabili di uno o più tipi, raggruppate sotto un nome comune.

Il linguaggio C. Notate che...

Programmazione I - Laboratorio

Programmazione II. Lezione 7. Daniele Sgandurra 9/11/2010.

Il C nel C++: Funzioni

puntatori Lab. Calc. AA 2007/08 1

Puntatori. Obiettivi: Richiamare quanto noto sui puntatori dal modulo A Presentare l analogia tra puntatori e vettori e l aritmetica dei puntatori

Laboratorio di Informatica Ingegneria Clinica Lezione 14-16/11/2011

Inside C : Puntatori. Indirizzo: operatore & p = &v; x = a; Puntatori Referenziazione e Dereferenziazione Arrays

Linguaggio C: le funzioni. Visibilità variabili e passaggio parametri

Argomenti Avanzati.! I puntatori! Stack! Visibilità delle Variabili

Lezione 9 programmazione in Java Classi come contenitori

Laboratorio di Calcolatori 1 Corso di Laurea in Fisica A.A. 2006/2007

Gestione della Memoria

Parametri Formali di una Funzione e Record di Attivazione

Laboratorio di Algoritmi e Strutture Dati

Associazione Variabile-Indirizzo

Le strutture. Una struttura C è una collezione di variabili di uno o più tipi, raggruppate sotto un nome comune.

Perché il linguaggio C?

Linguaggio C. Generalità sulle Funzioni. Variabili locali e globali. Passaggio di parametri per valore.

Suggerimenti, note utili ed errori comuni. Fondamenti di informatica T

Caratteri e stringhe

I puntatori e l allocazione dinamica di memoria

Es. 1. interi, li stampi a video ponendo prima i numeri pari e poi i numeri dispari. Es. 1. int readlength(file *f, int *even, int *odd)

Strutture Dinamiche. Fondamenti di Informatica

Linguaggio C: PUNTATORI

Il linguaggio C funzioni e puntatori

Introduzione ai puntatori in C Definizione

Capitolo 5 -- Stevens

Esercitazione 11. Liste semplici

Allocazione dinamica. VLA, malloc() e dintorni

Esercizi. Andrea Marin. a.a. 2011/2012. Università Ca Foscari Venezia Laurea in Informatica Corso di Programmazione part-time

Unità Didattica 5 Linguaggio C. Stringhe. Accesso a file ASCII. Strutture.

Esercizi riassuntivi (Fondamenti di Informatica 2 Walter Didimo) Soluzioni

Operatore di indirizzo

Fondamenti di Informatica AA 2016/2017

IEIM Esercitazione X Ripasso: array, puntatori, ricorsione. Alessandro A. Nacci -

Tipi di dati fondamentali. Tipi di dati fondamentali. Utilità dei tipi di dati nelle dichiarazioni. Il tipo di dati char. Codice ASCII.

Esercizio 2: Algebra dei Puntatori e Puntatori a Puntatori

Lezione 9: Puntatori a funzioni. Tipi enumerativi e orientati ai bit

Input/Output. Lettura e scrittura Caratteri e Stringhe: Terminale e file. Input/output. caratteri stringhe formattato ascii binari

Sommario. Le differenze fra C e C++ Funzioni. Varie. Memoria. commenti. parametri per funzioni funzioni inline overloading di funzione

Transcript:

Andrea Marin Università Ca Foscari Venezia Laurea in Informatica Corso di Programmazione part-time a.a. 2011/2012

Tipi di memoria dati Nella macchina astratta C esistono tre tipi di memoria per allocare le variabili: 1. Memoria statica 2. Stack 3. Memoria dinamica (heap)

Memoria statica Nella memoria statica vengono allocate le variabili globali i n t a ; i n t v e c t [ 1 0 0 ] ; i n t main ( ) { i n t c ; } a, vect sono allocati nella memoria statica

Lo stack La memoria stack è usata per memorizzare i record di attivazione delle funzioni Il record di attivazione è costituito da: L indirizzo di codice dell istruzione successiva a quella che ha invocato la funzione (indirizzo di rientro) I parametri della funzione Le variabili locali alla funzione

Esempio: codice i n t foo ( i n t z ) { i n t a ; a=z +1; return a ; } i n t main ( ) { i n t y =15; i n t x ; x = foo (, 1 3 ) ; p r i n t f ( % d\n, x ) ; return 0 ; }

Esempio /1: Stack

Esempio /2: Stack

Esempio /3: Stack

Uso dello stack e ricorsione L uso dello stack consente ad una funzione di invocare un altra funzione Questo causa la creazione di un nuovo record di attivazione sulla cima dello stack In questo modo le funzioni possono richiamare se stesse dando origine alla ricorsione

La memoria Heap Notiamo che sebbene -in generale- non sappiamo quanti record di attivazione saranno istanziati nello stack durante l esecuzione del programma, la dimensione di un record di attivazione si conosce dall analisi del codice La memoria dinamica consente di allocare spazi di memoria la cui dimensione si conosce solo in fase di esecuzione Esempio: scrivi un programma che dopo aver acquisito il numero di rilevazioni disponibili di una sonda di temperatura, le memorizzi in un vettore Quanto grande deve essere il vettore? È impossibile determinarlo in fase dall analisi del codice perchè dipende da un valore in input

Uso della memoria Heap In C, l allocazione nella memoria heap e la sua liberazione sono espliciti, cioè si usano apposite chiamate a funzioni La funzione malloc della libreria stdlib.h alloca uno spazio di memoria contiguo nell heap e restituisce un puntatore al primo byte allocato In case di fallimento restituisce il valore NULL che corrisponde all indirizzo riservato 0 La funzione free della librerira stdlib.h libera lo spazio di memoria precendemente allocato con la malloc

malloc prototipo: void* malloc(size t size); size t è un tipo equivalente ad unsigned int. Il parametro specifica la quantità di byte da allocare Il tipo del valore restituito è void*, che denota un valore di tipo indirizzo. void* specifica che il tipo dell oggetto indicizzato è sconosciuto Il valore è l indirizzo del primo byte allocato Se l allocazione non ha successo viene resituito l indirizzo NULL

Calcolo dello spazio richiesto: l operatore sizeof Per conoscere quanti byte occupa un tipo ti dato si può usare l operatore sizeof sizeof(int): restituisce il numero di byte occupati da un int sizeof(float): restituisce il numero di byte occupati da un float...

Esempio di allocazione vettore di float i n t main ( ) { f l o a t p t r ; i n t dim ; s c a n f ( % d, &dim ) ; / l e t t u r a d e l l a d i m e n s i o n e / i n t i ; p t r = m a l l o c ( s i z e o f ( f l o a t ) dim ) ; i f ( p t r ) { / s p a z i o a l l o c a t o / f o r ( i =0; i <dim ; i ++) s c a n f ( % f, &p t r [ i ] ) ; / s c a n f ( % f, p t r+i ) ; }.. }

Allocazione delle variabili

Eliminazione dello spazio allocato: free Prototipo: void free(void* ptr) Il puntatore ptr deve contenere l indirizzo del primo byte di memoria del blocco da liberare La memoria allocata va sempre liberata una volta terminato il suo uso I blocchi di memoria non liberati causano garbage

Acquisizione di una stringa: problemi Dal manuale GNU C The getline function is the preferred method for reading lines of text from a stream, including standard input. The other standard functions, including gets, fgets, and scanf, are too unreliable. (Doubtless, in some programs you will see code that uses these unreliable functions, and at times you will come across compilers that cannot handle the safer getline function. As a professional, you should avoid unreliable functions and any compiler that requires you to be unsafe.) Cosa c è di così insicuro nel seguente codice? char s t r i n g a [ 1 0 0 ] ; s c a n f ( % s, s t r i n g a ) ;

getline Le stringhe vanno acquisite con la funzione getline della libreria stdlib prototipo: size t getline(char** pstr, size t* pbytes, FILE* in); pstr è un puntatore al puntatore al primo byte della stringa. pbytes è un puntatore ad un intero che contiene il numero di bytes allocati per la stringa in è lo stream in input (tipicamente stdin) Lo spazio allocato per la stringa potrebbe non essere sufficiente a contenere l input. In questo caso la getline modifica l allocazione dell heap in modo da contenerlo. In questo case modifica anche il contenuto della variabile puntata da pbytes

Esempio #i n c l u de <s t d i o. h> i n t main ( ) { i n t b y t e s r e a d ; i n t n b y t e s = 9 ; char m y s t r i n g ; p r i n t f ( % s, P l e a s e e n t e r a l i n e o f t e x t. ) ; m y s t r i n g = m a l l o c ( n b y t e s + 1 ) ; b y t e s r e a d = g e t l i n e (& m y s t r i n g, &nbytes, s t d i n ) ; i f ( b y t e s r e a d == 1) p r i n t f ( ERROR! ) ; e l s e { p r i n t f ( You typed : %s, m y s t r i n g ) ; f r e e ( m y s t r i n g ) ; } return 0 ; }

Situazione in memoria