prof. Nunzio Brugaletta Programmazione e linguaggio C

EnneBi - Programmazione
Avanti Indietro Inizio


6.3 Strutture con allocazione dinamica della memoria

Si è già trattato di pile e code implementandole in strutture sequenziali di memoria. È opportuno ricordare, come già fatto osservare a suo tempo, che la struttura sequenziale può andare bene solo a determinate condizioni:

L’allocazione dinamica permette di riservare spazio in memoria solo quando serve e solo quello che serve ed inoltre, l’uso di puntatori permette di operare più velocemente senza spostare fisicamente i dati, per esempio, nel passaggio di parametri. Sono questi due punti importanti nell’ottica di ottimizzazione di risorse: si tenga presente che l’elaboratore trova impiego nel trattamento di grosse masse di dati e quindi la razionalizzazione dello spazio occupato e la velocità di elaborazione sono due punti critici da curare particolarmente.

L’input di un nuovo elemento da inserire in una struttura di dati potrebbe essere svolto, utilizzando l’allocazione dinamica della memoria, secondo lo schema seguente:

/* 
  Esempio di funzione per l’input di una struttura 
  effettuato utilizzando l’allocazione dinamica della memoria 
*/

#include <stdio.h>
#include <stdlib.h>	/*1*/

typedef struct rec { 
  char titolo[50]; 
  char autore[20]; 
  char editore[20]; 
  float prezzo; 
}libro;
...

void inserisci(){
  libro *buflib;	/*2*/
  buflib=(libro *) malloc(sizeof(libro));	/*3*/ 
  if(buflib==NULL){	/*4*/ 
    printf("\n\aImpossibile allocare nuovo spazio"); 
  }else{ 
    printf("\nInserimento di un libro"); 
    printf("\nTitolo : "); 
    gets(buflib->titolo);	/*5*/ 
    printf("Autore : "); 
    gets(buflib->autore);	/*5*/ 
    printf("Editore : "); 
    gets(buflib->editore);	/*5*/ 
    printf("Prezzo : "); 
    scanf("%f",&buflib->prezzo);	/*5*/ 
    while(!getchar()=='\n');
    ...	/*6*/ 
  } 
}

L’inclusione specificata in 1 permette di utilizzare le funzioni per l’allocazione dinamica della memoria.

Nella 2 si definisce un puntatore alla struttura libro. In questo modo non si alloca spazio in memoria come sarebbe se fosse stata definita una variabile di tipo libro. Lo spazio, necessario prima di effettuare l’input, viene allocato in 3.

La funzione malloc quando non riesce ad allocare spazio ritorna il valore NULL nel puntatore: tale condizione è testata in 4. Per il modo con il quale il C tratta le condizioni, la 4 poteva più propriamente essere espressa come: if(!buflib).

Nelle 5 vengono effettuati gli input nelle varie componenti della struttura. Si noti l’uso dell’operatore -> per referenziare le singole componenti.

A cominciare da 6 si può usare l’input effettuato per le elaborazioni richieste. Qualora richiesto, per passare l’input effettuato ad una funzione, basta passare il puntatore (si può, per esempio, utilizzare const se si tratta di passaggio per valore).



Avanti Indietro Inizio

http://ennebi.solira.org ennebi@solira.org