Newsgroup: it.comp.lang.c
Titolo: un programmino sul malloc e sul passaggio valore-indirizzo

salve a tutti... avrei bisogno di una mano perche' veramente 
sono alla frutta per questo problemino che mi si pone durante
lo sviluppo del mio primo applicativo serio...
premetto che lavoro in linux...:)
in pratica ... provate a prendere questo programmino:
/--------------------- cut here -----------------/
char *global;
#include <malloc.h>
main()
{
char *local;
allocate(global,10);
allocate(local,10);
exit(0);
}
allocate (char *pt,int size) 
{
if (!(pt=malloc(size))) {
        printf("\nERROR: OUT OF MEMORY\n");
        exit (0);
        }
}
/------------------- cut here --------------------------/
in pratica funziona cosi': io dichiaro due puntatori a carattere,
uno globale e uno locale alla main, quindi ho creato una funzione
sostitutiva al malloc che mi fa l'allocazione e contemporaneamente
controlla la disponibilita' di memoria...
so bene che sarebbe piu' facile (e forse piu' elegante) ritornare
il puntatore usando un return, ma volevo provare a vedere una strada
alternativa...
ora... prima e dopo il passaggio alla funzione di allocazione, la global
era e resta 0x0 ... mentre la local ha il suo address di memoria e resta 
uguale...
ovviamente l'errore deriva (io penso, ma posso sbagliare) dal fatto che 
devo passare l'address della variabile puntatore... in pratica chiamando
la funzione come faccio ora, io passo l'indirizzo della locazione per
valore... mentre se voglio che sia cambiabile dalla funzione di allocazione 
devo passare l'address di memoria della locazione stessa (incasinato vero?)...
 ora... non ci capisco niente: devo usare un puntatore a puntatore?... :)
so che e' possibile, con il doppio star, ma mentalmente non riesco a 
lavorarci : come devo dichiarare le global e local e come devo dichiarare
soprattutto le variabili formali della funzione allocate? 
con il gdb e un po' di lavoro ce la potrei fare anche da solo, ma mi piace 
proporre questi problemi che possono tornare utili a dei newbie...(e cosi'
mi risparmio un po' di lavoro ...gia' che ci sono :))) )
grazie infinite :) (dite la verita' che vi propongo dei bei problemini)
				Sadicamente :)
					Stefano Borini
---------------------------
quela:~# mount -t vfat /dev/hda1 /windows
mount: error mounting /dev/hda1... mmmh...It's full of rubbish !!
Try this instead:     mke2fs -c /dev/hda1 <block size>
It will work better !
---------------------------
                                          Stefano Borini

Ciao Stefano,
il problema e' proprio quello che tu hai indicato, e la soluzione pure.
La sintassi da seguire per lavorare con i puntatori a puntatori, in questo
caso risulta essere:
{
char *local;
...
allocate(&local,10);
...
}
allocate (char **pt,int size)
{
if (!(*pt=malloc(size))) {
        printf("\nERROR: OUT OF MEMORY\n");
        exit (0);
        }
}
ciao, Franco.
Franco Torrini - Software Engineer - 
f.to...@virtuart.it
VIRTUART - C.C.D. Creative Computer Design S.p.A.
Via di Quarto Annunziata, 80/b - 00189 Rome, Italy
Tel. 
+39 06 33076638
 - Fax. 
+39 06 33076670

Borini Stefano (
stu2528@NOSPAM_ME_OR_ILL_BOMB_YOU.student.unife.it
) wrote:
[ snip ]
: ovviamente l'errore deriva (io penso, ma posso sbagliare) dal fatto che 
: devo passare l'address della variabile puntatore... in pratica chiamando
: la funzione come faccio ora, io passo l'indirizzo della locazione per
: valore... mentre se voglio che sia cambiabile dalla funzione di allocazione 
: devo passare l'address di memoria della locazione stessa (incasinato vero?)...
:  ora... non ci capisco niente: devo usare un puntatore a puntatore?... :)
Esatto.
: so che e' possibile, con il doppio star, ma mentalmente non riesco a 
: lavorarci : come devo dichiarare le global e local e come devo dichiarare
: soprattutto le variabili formali della funzione allocate? 
Riprendendo il tuo esempio:
char *global;
#include <malloc.h>
main()
{
        char *local;
        allocate(&global, 10);
        allocate(&local, 10);
        exit(0);
}
allocate(char **pt, int size)
{
        if (!(*pt = malloc(size))) {
                printf("\nERROR: OUT OF MEMORY\n");
                exit(0);
        }
}
Ciao ciao
Andrea
-- 
"...Unix, MS-DOS, and Windows NT (also known as the Good, the Bad, and 
 the Ugly)."
(by Matt Welsh)