Il linguaggio C Gestione della memoria

Documenti analoghi
Operazioni sulle stringhe Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR

C: panoramica. Violetta Lonati

Una stringa di caratteri in C è un array di caratteri terminato dal carattere '\0' a p e \0

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

Il linguaggio C Strutture

Esercizio 1: funzione con valore di ritorno di tipo puntatore

Introduzione al C. Unità 8 Stringhe

Uso avanzato dei puntatori Allocazione dinamica della memoria

STRINGHE: ARRAY DI CARATTERI! a p e \0

Il linguaggio C Puntatori

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

Il blocco che costituisce il corpo di una funzione/procedura può contenere dichiarazioni di variabili. Esempio:

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

Allocazione dinamica della memoria

Il linguaggio C. Puntatori e dintorni

Librerie C. Corso di Linguaggi e Traduttori 1 AA Corso di Linguaggi e Traduttori 1 AA stdio.h

Stringhe Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR

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

Programmazione I (Classe 1)

Librerie C. Corso di Linguaggi e Traduttori 1 AA

La gestione della memoria dinamica Heap

Esercizio 1 (15 punti)

Linguaggio C e sistema operativo

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

char* titolo= Libreria sulle stringhe Esempi: (strcpy) (strstr)... Laboratorio di Informatica L-A 1

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

Laboratorio di Programmazione: Linguaggio C Lezione 21 del 19 maggio 2014

Stringhe e allocazione dinamica della memoria

Gestione di stringhe. Le stringhe in C/C++

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

Introduzione al C. Unità Gestione Dinamica della Memoria

Corso di Fondamenti di Informatica. Puntatori e Allocazione Dinamica

Il linguaggio C. Puntatori e dintorni

Stringhe. Concetti chiave

Esercizio 1 (15 punti)

s r t i r n i g n. g h s r t c r p c y s r t c r a c t s r t c r m c p s r t c r h c r s r t s r t s r

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

Università degli Studi di Cassino Corso di Fondamenti di Informatica Tipi strutturati: Stringhe. Anno Accademico 2010/2011 Francesco Tortorella

Lezione 5 Sottoarray di somma massima

string.h strcpy strc strcat strcmp strcmp strchr strstr strstr i t r ; s r \0 int strlen(char* str) char pippo[]={ p, i, p, p, o, \0 \ };

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

4 GLI ARRAY E LE STRINGHE

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

Definizione Allocazione e deallocazione di variabili Allocazione e deallocazione di vettori

Introduzione ai puntatori in C Definizione

Laboratorio di Programmazione 1. Docente: dr. Damiano Macedonio Lezione 18 31/03/2014

Linguaggio C - Array. Array: tipo nome_array[num_elementi]

Linguaggio C: PUNTATORI

I CARATTERI. Domanda: char c = 1 ; printf( c=%d\n, (int)c ); //cosa stampa?

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

Laboratorio di Algoritmi e Strutture Dati

Relativamente agli esempi sopra riportati, al termine dell esecuzione della funzione il file di uscita dovrà contenere quanto riportato a lato.

Linguaggio C - Puntatori

Stringhe. Prof. Lorenzo Porcelli

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

Il linguaggio C. Puntatori e Array

Dispensa 13 CORSO DI PROGRAMMAZIONE A.A CORSO DI LAUREA IN INGEGNERIA E SCIENZE INFORMATICHE CESENA. Laboratorio

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

Programmazione I - Laboratorio

Programmazione I - Laboratorio

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

9 - Array. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Precedenza e associatività. Complementi sul C - 2. Esempi. Esempi

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

dott. Sabrina Senatore

Librerie Stringhe. Librerie e stringhe. Lezione 9. Laboratorio di Programmazione I. Corso di Laurea in Informatica A.A. 2015/2016

L'Allocazione Dinamica della Memoria nel linguaggio C

Esercizi di programmazione in linguaggio C English Dictionary

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

Informatica 2 modulo C Massimo Callisto De Donato

Allocazione dinamica della memoria

Consideriamo un vettore allocato dinamicamente

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

Strutture Dati Dinamiche

Caratteri e stringhe

Parametri by reference. Funzioni. Passaggio dei parametri. Parametri by reference. Soluzione. Problemi

Programmazione (imperativa)

Sommario FONDAMENTI DI INFORMATICA 1. Il tipo FILE. Passaggio da standard I/O. LINGUAGGIO C Gestione dei file

Tutorato Programmazione 1 Modulo 2

Breve Ripasso del linguaggio C

Linguaggio C: Espressioni

1 MANIPOLAZIONE DI STRINGHE ZERO-TERMINATE

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

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

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

Passare argomenti al programma

La gestione della memoria

L Allocazione Dinamica della Memoria

Corso di Informatica 1 Esercitazione n. 4

Lezione 6: Funzioni di I/O avanzate

Esercitazione 12. Esercizi di Ricapitolazione

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

Esercizio 1. Esercizio 1 - Soluzione

L'allocazione dinamica della memoria

Caratteri e stringhe

Implementazione di Liste puntate

Struct, enum, Puntatori e Array dinamici

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

Gestione dinamica della memoria

Esercizio 1 - Soluzione

Transcript:

Il linguaggio C Gestione della memoria Moreno Marzolla Dipartimento di Informatica Scienza e Ingegneria (DISI) Università di Bologna http://www.moreno.marzolla.name/

Linguaggio C - Gestione della memoria 2

Ringraziamenti Questi lucidi si basano su materiale fornito dal prof. Mirko Viroli, Università di Bologna Linguaggio C - Gestione della memoria 3

Puntatore a puntatore Si può definire un puntatore ad una zona di memoria che contiene a sua volta un puntatore /* punt-punt.c : esempio di puntatore a puntatore */ #include <stdio.h> int main( void ) { int a = 0; int *pa = &a; int **ppa = &pa; printf("a=%d, pa=%p\n", a, (void*)pa); printf("ppa=%p, *ppa=%p, **ppa=%d\n", (void*)ppa, (void*)*ppa, **ppa); return 0; a pa ppa 0 a=0, pa=0x7fff3fcd849c Linguaggio C - Gestione della memoria Memoria 4 ppa=0x7fff3fcd84a0, *ppa=0x7fff3fcd849c, **ppa=0

/* punt-punt2.c */ #include <stdio.h> int main( void ) { int a0[2] = {, 2; int a[2] = {3, 4; int *ap[2]; int **pp = ap; ap[0] = a0; ap[] = a; printf("pp[0][0]: %d\n", pp[0][0]); /* stampa */ printf("pp[0][]: %d\n", pp[0][]); /* stampa 2 */ printf("pp[][0]: %d\n", pp[][0]); /* stampa 3 */ printf("pp[][]: %d\n", pp[][]); /* stampa 4 */ printf("**pp: %d\n", **pp); /* stampa */ printf("*(*pp+): %d\n", *(*pp+)); /* stampa 2 */ printf("**(pp+): %d\n", **(pp+)); /* stampa 3 */ printf("*(*(pp+)+): %d\n", *(*(pp+)+)); /* stampa 4 */ return 0; pp ap[] a0[] a[] Memoria Linguaggio C - Gestione della memoria 5

**pp pp *pp **pp Linguaggio C - Gestione della memoria 6

*(*pp + ) *pp *pp + *(*pp+) 2 3 4 Linguaggio C - Gestione della memoria 7

pp **(pp + ) pp+ *(pp+) **(pp+) Linguaggio C - Gestione della memoria 8

pp pp+ *(*(pp+)+) *(pp+) *(pp+)+ *(*(pp+)+) Linguaggio C - Gestione della memoria 9

Puntatori a puntatori Sono utili per gestire array di stringhe di caratteri /* es-array-str.c : Esempio di array di stringhe */ #include <stdio.h> int main( void ) { char *parole[] = {"Ciao", "come", "stai?", NULL; int i; for (i=0; parole[i]!= NULL; i++) { printf("%s ", parole[i]); printf("\n"); return 0; parole[] X Ciao\0 come\0 stai?\0 Memoria Linguaggio C - Gestione della memoria 0

Array di stringhe In realtà la funzione main() accetta un intero e un array di stringhe Il sistema operativo li setta al numero di argomenti sulla riga di comando, e le stringhe che rappresentano tali argomenti /* main-param.c : Esempio di array di stringhe */ #include <stdio.h> $./main-param uno due tre -3 parametro 0:./main-param parametro : uno parametro 2: due int main( int argc, char* argv[] ) parametro 3: tre { parametro 4: -3 int i; for (i=0; i < argc; i++) { printf("parametro %d: %s\n", i, argv[i]); return 0; Linguaggio C - Gestione della memoria

La funzione malloc() Definita in stdlib.h Serve per allocare (riservare) una porzione di memoria da usare per memorizzare qualunque dato Si passa come parametro la dimensione (in byte) richiesta malloc()ritorna un puntatore void * che deve essere convertito (con un cast) al puntatore di tipo richiesto La memoria va liberata quando non serve più con free() Con malloc() è possibile creare array la cui dimensione non è nota a priori Consente anche di realizzare funzioni che creano array e li restituiscono come risultato Linguaggio C - Gestione della memoria 2

Esempio /* reverse-fun.c : esempio di funzione che ritorna un array */ #include <stdio.h> #include <stdlib.h> /* Dato un array a[] di n elementi, restituisce un nuovo array di n elementi il cui contenuto e' il contenuto di a[] "a rovescia" */ int *reverse(int a[], int n) { int *r = (int *)malloc(n*sizeof(int)); int i; for (i=0; i<n; i++){ r[i]=a[n--i]; return r; int main( void ) { int in[] = {0, 20, 30, 40; int *out = reverse(in, 4); printf("%d %d %d %d\n", out[0], out[], out[2], out[3]); free(out); return 0; Linguaggio C - Gestione della memoria 3

La libreria <string.h> Contiene varie funzioni per manipolare stringhe Si ricordi che la stringa prova è un array di 6 caratteri, 'p' 'r' 'o' 'v' 'a' '\0' Linguaggio C - Gestione della memoria 4

Alcune funzioni di <string.h> size_t strlen(const char *s); Restituisce la lunghezza (numero di caratteri) di s int strcmp(const char *s, const char *s2); Ritorna un valore minore, maggiore, uguale a 0 se s è "minore", "maggiore", "uguale a" s2 Si usa l'ordinamento lessicografico tra stringhe char *strcpy(char *dest, const char *src); Copia il contenuto di src in dest dest deve puntare ad una area di memoria già allocata, sufficientemente capiente restituisce un puntatore a dest char *strcat(char *dest, const char *src); Appende la stringa src alla fine di dest dest deve puntare ad una area di memoria già allocata, sufficientemente capiente restituisce un puntatore a dest Linguaggio C - Gestione della memoria 5

Esempio riassuntivo /* demo-string.c */ #include <stdio.h> #include <string.h> Lunghezza di "Prova" e' 5 Lunghezza di "Casa" e' 4 Copia di "Prova" su c3; c3 diventa: "Prova" Concatena "Casa" a c3: "ProvaCasa" Confronto "Prova" e "Prova": 0 int main( void ) Confronto "Prova" e "Casa": 3 { Confronto "Casa" e "Prova": -3 char c[] = "Prova"; char c2[] = "Casa"; char c3[00]; printf("lunghezza di \"%s\" e' %d\n", c, (int)strlen(c)); printf("lunghezza di \"%s\" e' %d\n", c2, (int)strlen(c2)); strcpy(c3,c); printf("copia di \"%s\" su c3; c3 diventa: \"%s\"\n", c, c3); strcat(c3,c2); printf("concatena \"%s\" a c3: \"%s\"\n", c2, c3); printf("confronto \"%s\" e \"%s\": %d\n", c, c, strcmp(c, c)); printf("confronto \"%s\" e \"%s\": %d\n", c, c2, strcmp(c, c2)); printf("confronto \"%s\" e \"%s\": %d\n", c2, c, strcmp(c2, c)); return 0; Linguaggio C - Gestione della memoria 6

Attenzione all'allocazione Le funzioni strcat() e strcpy() vanno a copiare dei caratteri da una stringa src ad una dest Bisogna fare attenzione ad accertarsi che nel fare ciò non si esca dai limiti consentiti per dest, rischiando di sovrascrivere memoria altrui #include <stdio.h> #include <string.h> P r o v a R p r o v a \0???? int main( void ) { char s[0] = "Prova"; char s2[] = "Riprova"; strcat(s, s2); /* No! Non c'e' abbastanza spazio in s[] */ printf("risultato della concatenazione: \"%s\"\n", s); return 0; Linguaggio C - Gestione della memoria 7 i \0