Enrere Mòdul 7
Fonaments de programació. Llenguatge C/C++---
Pràctica    Resum teòric Exercicis
Pràctica d'ampliació

 
Reassignació de memòria

En aquesta pràctica veurem l'ús de la funció realloc().

 

Desenvolupament de la pràctica

A la pràctica anterior només era necessari una crida a la funció calloc() o malloc() de reserva de memòria, ja que quan s'introdueix el nombre n ja se sap tota la memòria necessària. En moltes situacions s'ha de començar a emmagatzemar dades abans de saber quantes dades s'emmagatzemaran, en aquest cas no es pot reservar tota la memòria alhora sinó que s'ha de reservar només espai per una dada cada vegada que es necessita. Per poder referir-se a totes les dades amb un vector és necessari que totes les dades es trobin en una posició contigua, això s'aconsegueix amb la funció realloc().

Definiu un projecte nou anomenat m7pa2 i afegiu-li un arxiu de font C/C++ anomenat m7pa2.cpp. Escriviu el següent codi:

//m7pa2.cpp: Reassignació de memòria


#include<stdio.h>
#include<stdlib.h>


void main(){
    int dada,n=0, ct;
    int*a;

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

   printf("Introdu
ïu nombres enters. La introducció de -1\n");
   printf("acabar
à l'entrada de dades...\n");

   do{
       scanf("%d",&dada);
       a=(
int*)realloc(a,(n+2)*sizeof(int));
       a[n]=dada;
       n++;
    }
while(dada!=-1);


    printf("\nS'han introdu
ït %d números\n",n);
    for(ct=0;ct<n;ct++) printf("%d\t",a[ct]);


}

Explicació del programa

Aquest programa guardarà en memòria tots els números enters introduïts pel teclat fins que s'introdueixi el número -1. Llavors ens indicarà el nombre de números introduïts i els tornarà a imprimir tots.

Es comença reservant espai per una variable entera (almenys s'ha d'introduir una dada):

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

La variable a es declara com un punter a un enter. La segona línia correspon a l'inicialització del punter.

L'assignació d'espai per cada nova dada es fa en la línia marcada del següent bucle:

 
do{
       scanf("%d",&dada);
       a=(
int*)realloc(a,(n+1)*sizeof(int));
       a[n]=dada;
       n++;
}
while(dada!=-1);

La funció realloc() reserva espai de memòria contigua per emmagatzemar tots els nombres que ja estaven emmagatzemats més 1. El punter a apuntarà ara a aquesta nova zona.

Aquest bucle s'executa fins que s'introdueixi un -1, llavors imprimeix el nombre total de números introduïts (contant el -1) i la llista de tots els números.