Vai alla Home Page About me Courseware Federica Living Library Federica Federica Podstudio Virtual Campus 3D Le Miniguide all'orientamento Gli eBook di Federica La Corte in Rete
 
I corsi di Scienze Matematiche Fisiche e Naturali
 
Il Corso Le lezioni del Corso La Cattedra
 
Materiali di approfondimento Risorse Web Il Podcast di questa lezione

Salvatore Cuomo » 10.Il linguaggio C – parte terza


Allocazione dinamica: esempio 1

Problema

Scrivere una funzione di tipo main che effettui operazioni su vettori la cui lunghezza viene definita in ingresso del programma (allocazione dinamica dei vettori).

Codice_C_1

Codice_C_1


Nota esempio 1

Allocazione dinamica
In C è possibile allocare spazio di memoria per un array durante l’esecuzione del programma. Non è dunque necessario stabilire la dimensione massima di un array all’atto della sua dichiarazione. Se ad esempio si dichiara:

int a[100];

si dice che abbiamo utilizzato una allocazione statica perché a run – time viene allocato uno spazio di 100 variabili di tipo int indipendentemente da quanto sarà la lunghezza del vettore a.

Con una istruzione del tipo:

int *a;
int n=3;
a=(int *)malloc(n*sizeof(int));

Il vettore viene allocato dinamicamente dal programma ed è un vettore di dimensione 3.

Allocazione dinamica

L’allocazione dinamica della memoria si realizza mediante le funzioni malloc e calloc definite nell’header file di sitema stdlib.h
L’istruzione:

char *malloc(size);

restituisce un puntatore a carattere che punta ad una are di memoria di lunghezza size in byte. Con tale istruzione lo spazio di memoria non è inizializzato.

L’istruzione:

char *calloc(n,size);

restituisce un puntatore a carattere che punta a n parole di lunghezza size in byte di memoria allocato. Le parole di memoria allocato vengono inizializzate a 0

Se la memoria richiesta non è disponibile, malloc e calloc restituiscono una costante NULL, che assume valore 0.

Operatore sizeof

Per determinare il numero di byte necessari alla costruzione di un array di elementi di un fissato tipo si utilizza un operatore speciale sizeof.

L’operatore sizeof restituisce la lunghezza in byte di un fissato tipo di dato

Esempio

float b; ..

  1. a=sizeof(b);
  2. a=sizeof(float);

Per conoscere la lunghezza in byte di un dato di tipo float la 1. o la 2. sono istruzioni equivalenti.

Si osservi che il valore di ritorno di sizeof ovvero la lunghezza in byte è un tipo di dato intero.

Esempio 1

Torniamo nuovamente all’esempio 1. Le istruzioni:

a=(int *)malloc(n*sizeof(int));
b=(float *)malloc(n*sizeof(float));

per quanto detto consentono di allocare un vettore a di interi di dimensione n ed un array b di reali di dimensione n.
Le istruzioni:

free(a); free(b);

Consentono di restituire al sistema la memoria allocata per a e b.
In generale la memoria viene restituita esplicitamente mediante la funzione

free(ptr);

Esempio 2

Problema

Scrivere una funzione di tipo main che passa ad una funzione array dichiarato dinamicamente.

Nell’esempio si mette in evidenza che un array può essere passato come:

array1d(A,B,3);

oppure

array1d(&A[0],&B[0],5);

Codice_C_3

Codice_C_3

Codice_C_2

Codice_C_2


Allocazione dinamica di una matrice

In C abbiamo visto l’utilizzo degli array bidimensionali allocato staticamente. Una matrice è una struttura dati che in memoria viene registrata per righe.
Per memorizzare dinamicamente una matrice, ed esempio di reali, è necessaria una dichiarazione del tipo:

float **a;

La variabile così definita è detta in gergo puntatore a puntatore. Per allocare una matrice di float ad esempio:

a=(float**)calloc(n,sizeof(float*));
for (i=0;i
a[i]=(float*)calloc(m,sizeof(float));

In maniera analoga si può utilizzare la funzione malloc.

Allocazione dinamica di Matrici.

Allocazione dinamica di Matrici.


Allocazione dinamica di una matrice-Esempio

Esempio Di una matrice A di dimensione 5 x 5, riportata in figura vogliamo accedere all’elemento di posizione A(2,3).

Utilizzando la sintassi dei puntatori l’elemento viene così individuato:

A(2,3) → *(*(A+2)+3)

(A+2) è il secondo puntatore;
*(A+2) è il contenuto del secondo puntatore ovvero l’indirizzo del primo elemento della seconda riga;
*(A+2)+3 è l’indirizzo del 3 elemento della seconda riga;
*(*(A+2)+3) è il contenuto del puntatore al 3 elemento della seconda riga.

Utilizzo di puntatori a puntatori.

Utilizzo di puntatori a puntatori.

Matrice.

Matrice.


Esempio 3

Problema

Scrivere una funzione di tipo main che passa ad una funzione un array bidimensionale dichiarato dinamicamente.

Nell’esempio si mette in evidenza che un array può essere passato come:

array2d(A,B,3);

oppure

array2d(&A[0],&B[0],5);

Codice_C_4

Codice_C_4

Codice_C_5

Codice_C_5


Esempio 4

Problema

Scrivere una funzione di tipo main che richiami una funzione matvet per il calcolo del prodotto matrice vettore. Si utilizzi l’allocazione dinamica.

Codice_C_6

Codice_C_6


Esempio 4 (segue)

Problema

Si riporta la funzione:

void matvet(float **, int , int ,
float *, float *);

Codice_C_7

Codice_C_7


I materiali di supporto della lezione

Pointers and Memory

Esercizi

  • Contenuti protetti da Creative Commons
  • Feed RSS
  • Condividi su FriendFeed
  • Condividi su Facebook
  • Segnala su Twitter
  • Condividi su LinkedIn
Progetto "Campus Virtuale" dell'Università degli Studi di Napoli Federico II, realizzato con il cofinanziamento dell'Unione europea. Asse V - Società dell'informazione - Obiettivo Operativo 5.1 e-Government ed e-Inclusion