Newsgroup: it.comp.lang.c
Titolo: Chiarimento esercizio  con funzione  malloc()

In rete ho trovato un esempio delle funzioni malloc() e realloc().
Alla riga 38 è riportato l'istruzione " if(usati>allocati)".
Qualcuno potrebbe spiegarmi perchè è stato introdotto questo controllo?
 
Dal momento che si entra nel ciclo  while (riga 35),
l'incremento della variabile "usati" è sempre garantita
(riga 37  usati += dimint;)e quindi
l'istruzione   if(usati>allocati) (riga 38)
sarà sempre VERA...
 
 
 
Ciao
 
 
 
***********************************************************+
Sito da cui ho copiato il codice:
 
http://www.html.it/pag/15417/allocazione-dinamica-della-memoria-funzione-realloc/
 
*********************************
1	#include <stdio.h>
2	
3	int main()
4	{
5	   char buffer[20];
6	   int i=0, n=0, x, *array, nb;
7	
8	   /* byte allocati */
9	   int allocati;
10	   /* byte in un blocco */
11	   int dimbloc;
12	   /* byte in un intero */
13	   int dimint;
14	   /* byte contenenti interi */
15	   int usati;
16	
17	   nb = 1;
18	   printf(“Elementi in un blocco: %dn”, nb);
19	
20	   dimint = sizeof(int);
21	   dimbloc = nb * dimint;
22	   usati = 0;
23	
24	   array = (int *)malloc(dimbloc);
25	   if(array == NULL)
26	   {
27	      printf(“Memoria insufficienten”);
28	      exit(1);
29	   }
30	
31	   allocati = dimbloc;
32	   printf(“Allocati: %d bytesn”, allocati);
33	   printf(“Input di interi terminati da # :n”);
34	
35	   while(scanf(“%d”, & x))
36	   {
37	      usati += dimint;
38	      if(usati>allocati)
39	      {
40	         allocati += dimbloc;
41	         array = (int *)realloc(array, allocati);
42	         if(array == NULL)
43	         {
44	            printf(“Memoria insufficienten”);
45	            exit(1);
46	         }
47	         i++;
48	      }
49	      /* in questo modo vengono letti n interi */
50	      array[n++] = x;
51	   }
52	
53	   printf(“n”);
54	   printf(“Allocati: %d bytesn”, allocati);
55	   printf(“Dim. blocchi: %d bytesn”, dimbloc);
56	   printf(“Dim. intero: %d bytesn”, dimint);
57	   printf(“Usati: %d bytesn”, usati);
58	   printf(“Chiamate realloc: %dn”, i);
59	   printf(“Numeri: %dn”, n);
60	   printf(“nEcco i numerin”);
61	
62	   for(i=0; i<n; i++)
63	   {
64	      printf(“%5d%c”, array[i], i%10 == 9 ? ‘n’ : ‘ ‘);
65	   }
66	
67	   printf(“n”);
68	
69	   return 0;
70	}
 


Se vuoi convincerti del funzionamento del codice, prova a mettere prima della riga 37 due printf per vedere il valore di usati ed allocati e ti renderai conto che la prima volta usati ed allocati saranno uguali e quindi non sara' necessario riallocare il vettore in quanto e' gia' stato fatto alla riga 24 per contenere un intero. 
Procedendo con le iterazioni pero', per esempio alla iterazione 2, lo spazio del
vettore e' stato esautiro con il primo numero e se voglio farci entrare anche il secondo devo allargarlo appunto con la realloc, e di qui di conseguenza.
 
Spero di essere stato chiaro.
 
In questo genere di dubbi il massimo sarebbe un debug.
gdb e' poco intuitivo ma ci sono dei wrapper (una volta c'era insight ma attualmente e' difficile trovare qualcosa di simile (ddd forse) ed ispezionare il valore delle variabili per togliersi questi dubbi
 
Ciao

 vettore e' stato esautiro con il primo numero e se voglio farci entrare anche il secondo devo allargarlo appunto con la realloc, e di qui di conseguenza.
 
 
Quindi, senza il controllo if... mi troverei sempre allocato un blocco 
in piï¿œ rispetto al necessario??
 
ciao


Senza contare poi (l'esempio ha un senso se si immagina poi di dover _usare_ questi dati immagazzinati in un vettore) la corrispondenza tra la i-esima posizione nel vettore e l'i-esimo dato immagazzinato.