Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Chiarimento esercizio con funzione malloc()

22 views
Skip to first unread message

NERO23

unread,
May 1, 2013, 4:34:56 AM5/1/13
to
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 }

arkkimede

unread,
May 2, 2013, 7:57:28 AM5/2/13
to
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

NERO23

unread,
May 4, 2013, 2:17:39 PM5/4/13
to

> 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.


Quindi, senza il controllo if... mi troverei sempre allocato un blocco
in piᅵ rispetto al necessario??

ciao

peterp...@gmail.com

unread,
May 6, 2013, 2:54:55 AM5/6/13
to
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.
0 new messages