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

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

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

Fondamenti di Informatica T. Linguaggio C: i puntatori

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

Gestione dinamica della memoria

Introduzione al C. Unità Gestione Dinamica della Memoria

Il linguaggio C. Puntatori e dintorni

L'allocazione dinamica della memoria

Allocazione dinamica della memoria

La gestione della memoria dinamica Heap

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

Allocazione Dinamica della Memoria

Struct, enum, Puntatori e Array dinamici

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

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

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

Definizione Allocazione e deallocazione di variabili Allocazione e deallocazione di vettori

Corso di Fondamenti di Informatica. Puntatori e Allocazione Dinamica

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

Esercizi Array Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR

L Allocazione Dinamica della Memoria

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

Il linguaggio C. Puntatori e Array

Lezione 21 e 22. Valentina Ciriani ( ) Laboratorio di programmazione. Laboratorio di programmazione. Lezione 21 e 22

Lezione 9: Strutture e allocazione dinamica della memoria

I puntatori e l allocazione dinamica di memoria

Strutture Dinamiche. Fondamenti di Informatica

Esercizi di programmazione in linguaggio C English Dictionary

Implementazione di Liste puntate

File binari, Operazioni sui File binari, Allocazione dinamica della memoria

Operatore di indirizzo

Allocazione dinamica. VLA, malloc() e dintorni

Non ci sono vincoli sul tipo degli elementi di un vettore Possiamo dunque avere anche vettori di

Array Tipi di dato semplici e strutturati strutturati array elementi omogenei numero d ordine indice lunghezza dimensione

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

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

Passare argomenti al programma

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

I puntatori. Un puntatore è una variabile che contiene l indirizzo di un altra variabile. puntatore

La gestione della memoria

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

Introduzione ai puntatori in C Definizione

Programmazione I - Laboratorio

FILE BINARI FILE BINARI

Fondamenti di Informatica T-1 Modulo 2

Introduzione al C. Tipi derivati

Fondamenti di Informatica T. Linguaggio C: i puntatori

giapresente( ) leggi( ) char * strstr(char * cs, char * ct) NULL

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

Consideriamo un vettore allocato dinamicamente

Puntatori. Fondamenti di Programmazione

Linguaggio C: puntatori

I puntatori e l allocazione dinamica di memoria. Esercizi risolti

Ottenere una modifica del parametro attuale

Il C nel C++: Funzioni

Il linguaggio C. Notate che...

puntatori Lab. Calc. AA 2007/08 1

Passaggio parametri puntatore

Programmazione (imperativa)

Esercizio 1: funzione con valore di ritorno di tipo puntatore

Linguaggio C - Strutture

Esercizio 2: Algebra dei Puntatori e Puntatori a Puntatori

Array e puntatori in C

stringhe array monodimensionali char. libreria < string.h>

Esercizio 2 (punti 7) Dato il seguente programma C: #include <stdio.h> int swap(int * nome, int length);

Allocazione dinamica della memoria - riepilogo

Puntatori in C Lucidi della Pof.ssa Pazienza

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

Allocazione Dinamica della Memoria

Strutture dati e loro organizzazione. Gabriella Trucco

Esercizi C su array e matrici

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

Gestione della Memoria

Laboratorio di Informatica

Programmazione. Laboratorio. Roberto Cordone DI - Università degli Studi di Milano

Puntatori a Funzioni e Callback. Massimo Benerecetti

Array. Maurizio Palesi Salvatore Serrano. In C si possono definire tipi strutturati Vi sono due costruttori fondamentali

La struttura dati CODA

Scope delle variabili e passaggio parametri. Danilo Ardagna Politecnico di Milano

Lettura da tastiera e scrittura su monitor

Fondamenti di Informatica T-1 Modulo 2. Obiettivo di questa esercitazione. Files Allocazione dinamica della memoria

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

Stringhe e allocazione dinamica della memoria

Appunti tratti dal videocorso on-line di Algoritmi e Programmazione Avanzata By ALeXio

Funzioni e. Alessandra Giordani Mercoledì 16 maggio 2012

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

Passaggio parametri puntatore

Linguaggi di programmazione + laboratorio a.a. 2012/2013

Fondamenti di Informatica T-1, 2010/2011 Modulo 2. Prova d Esame 5A di Mercoledì 13 Luglio 2011 tempo a disposizione 2h

2001 Pier Luca Montessoro, Davide Pierattoni (si veda la nota di copyright alla slide n. 2) Fondamenti di Informatica.

Complementi. - Ridefinizione di tipo - - Costrutto switch - - Programmazione su più file - - Parametri della funzione main - Funzione system -

INFORMATICA DI BASE Linguaggio C Prof. Andrea Borghesan

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

Array multidimensionali e stringhe

ERRATA CORRIGE. void SvuotaBuffer(void); void SvuotaBuffer(void) { if(getchar()!=10) {svuotabuffer();} }

Corso di Fondamenti di Informatica

Linguaggio C - Puntatori

Funzioni, puntatori, strutture. Lab. Calc. AA 2006/07

Problem solving elementare su dati vettoriali

Un puntatore è una variabile che contiene l indirizzo di una variabile. Una variabile di tipo puntatore è dichiarata tramite il costruttore di tipo *

Transcript:

Allocazione Statica Finora abbiamo visto che le variabili sono sempre definite staticamente. Questo è un limite perché la loro esistenza deve essere prevista e dichiarata a priori. In particolare per variabili di tipo array, in cui dover specificare a priori le dimensioni (costanti) è molto limitativo. Sarebbe molto utile poter allocare un array durante l esecuzione del programma (run-time) dopo aver scoperto quale deve essere la sua dimensione Allocazione Dinamica Per allocare nuova memoria durante l esecuzione del programma quando serve si usa una funzione di libreria che ne effettua la richiesta al sistema operativo: malloc() La funzione malloc(): chiede al sistema di allocare un area di memoria della dimensione specificata come parametro restituiscel indirizzo generico (void *)dell area di memoria allocata La funzione malloc() La funzione void *malloc(size_t dim): chiede al sistema di allocare un area di memoria grande dim byte restituisce l indirizzo dell area di memoria allocata (NULLse,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 da un area di memoria detta heap La funzione malloc() Uso: va specificato quanti byte si vogliono allocare attraverso il parametro passato a malloc() l indirizzo restituito dalla funzione va salvato in una variabile puntatore del tipo necessario Attenzione: malloc() restituisce un indirizzo puro, ossia un void * per assegnarlo a uno specifico puntatore occorre un cast esplicito

Esempio Allocazione dinamica di 16 byte per memorizzare numeri reali: float *p; p = (float*) malloc(16); Allocazione dinamica di 4 interi (qualunque sia la rappresentazione usata per gli interi): int *p; p = (int*) malloc(4*sizeof(int)); l operatore sizeofconsente di essere indipendenti dal sistema di elaborazione Tempo di vita Tempo di vita di una area dati dinamica non è legato a quello della funzione che la alloca quindi, una area dati dinamica può sopravvivere anche dopo che l esecuzione della funzione che l ha creata è terminata Ciò consente di creare un area dinamica in una funzione...... usarla in un altra funzione...... e distruggerla in una funzione ancora diversa Uso L area allocata è usabile, in maniera equivalente: tramite la notazione a puntatore ( *p) oppure tramite la notazione ad array( [ ] ) int *p; p=(int*)malloc(5*sizeof(int)); p[0] = 13; p[1] = 18;... *(p+4) = -20; Disallocazione Quando non serve più, l area allocata deve essere esplicitamente deallocata con una funzione che segnala al sistema operativo che quell area è da considerare nuovamente disponibile per altri usi. La deallocazionesi effettua mediante la funzione di libreria free() int *p=(int*)malloc(5*sizeof(int));... free(p);

Esempi Creazione un arraydi floatdi dimensione specificata dall utente #include <stdio.h> #include <stdlib.h> main() float *v; int n; printf("dimensione: "); scanf("%d",&n); v = (float*) malloc(n*sizeof(float));... uso dell array... free(v); Esempio Scrivere una funzione che, dato un intero, allochi e restituisca una stringa di caratteri della dimensione specificata #include <stdlib.h> char* alloca(int n) return (char*) malloc(n*sizeof(char)); NOTA: nella funzione non deve comparire la free(), in quanto scopo della funzione è proprio creare un arrayche sopravviva alla funzione stessa Array Dinamici Un arrayottenuto per allocazione dinamica è dinamico poiché le sue dimensioni possono essere decise durante l esecuzione del programma al momento della sua creazione e non a priori da chi scrive il programma. Non significa che l arraypossa essere espanso secondo necessità: una volta allocato, l array ha dimensione fissa Il modello di gestione della memoria dinamica del C richiede che l'utente si faccia esplicitamentecarico anche della deallocazione della memoria Nota: È un approccio pericoloso: molti errori sono causati proprio da un errata deallocazione. Si rischia di utilizzare puntatori che puntano ad aree di memoria non più esistenti (perché deallocate) dangling reference Esempio char *cp = NULL; /*... */ char c; cp = &c; /* c falls out of scope */ /* cp is now a dangling pointer */

Esempio di dangling pointer int * func ( void ) int num = 1234; /*... */ return &num; Il valore restituito dalla funzione è un dangling pointer. #include <stdlib.h> char *cp = malloc ( A_CONST ); /*... */ free ( cp ); /* cp now becomes a dangling pointer */ cp = NULL; /* cp is no longer dangling */ /*... */ int i; /* iintero */ int (*ip); /* ippuntatorea intero */ int *ip; /* come sopra*/ int (*ipa)[4]; /* ipa puntatore a un array di quattro interi.*/ int *iap[4]; /* attenzione: iapnon è puntatorea un array, ma è un array diquattropuntatoria int. */ Allocazione di un vettore void *vet_alloc(int n_elem, int dim) void *p; /* p punta al vettore di n_elem elementi */ p = malloc(n_elem * dim); if (p == NULL) printf("errore di memoria!\n"); exit(-1); return p; La chiamata int * vet = (int *)vet_alloc(10, sizeof(int));

float **mat_alloc(int rig, int col) float **p, *buf; int i; /* buf punta all'area dati di rig x col elementi */ buf = (float *)malloc(rig * col * sizeof(float)); /* p punta al vettore di puntatori alle righe */ p = (float **)malloc(rig * sizeof(float *)); if (!p) errore_all; exit(-1); /* inserisco in p i puntatori alle righe */ for(i=0; i<rig; i++, buf+=col) p[i] = buf; return p; La chiamata float ** mat = mat_alloc(n_row, n_col); Allocazione di matrice triangolare bassa int **mat_alloc(int rig) int **p; int i; /* p punta al vettore di puntatori alle righe */ p = (int **)malloc(rig * sizeof(int *)); if (!p) printf("errore di memoria!\n"); exit(-1); /* inserisco in p i puntatori alle righe */ for(i=0; i<rig; i++) p[i] = (int *)malloc((i+1) * sizeof(int)); if(!p[i])printf("memoria insufficiente!\n");exit(- 1); La chiamata per creare una matrice di nrighe int ** mat = mat_alloc(n); Inserimento di numeri casuali in matrice triangolare bassa #define MAX 255... void genera(int **mat, int n) int i,j; for(i=0; i<n; i++) for(j=0; j<=i; j++) mat[i][j] = rand()%(max +1); La chiamata per generare i valori compresi tra 0 e MAX da inserire nella matrice mat genera(mat, n); Stampa di matrice triangolare bassa void stampa_mat(int **mat, int n) int i,j; for(i=0; i<n; i++) for(j=0; j<=i; j++) printf("%d\t", mat[i][j]); printf("\n"); printf("\n\n"); La chiamata per stampare la matrice mat stampa_mat(mat, n);

Allocazione di un vettore di strutture di tipo struct dati struct dati *my_alloc(int n) struct dati *p; p = (struct dati *)malloc(n); if (!p) printf("errore di memoria!\n"); exit(-1); return p; La chiamata per allocare un vettore di struct dati di n elementi struct dati *info = my_alloc(n * sizeof(struct dati ));