Newsgroup: it.comp.lang.c
Titolo: array, malloc e sizeof

salute a tutti.
mi spiace postare quello che, probabilmente, risultera' essere un problema
banale ma, ne` con l'ausilio delle faq, ne` con l'ausilio di dejanews
et similia, sono riuscito a trovare una soluzione.
come faccio a sepere la dimensione di un array?
avendo una situazione del tipo:
char stringa[10]="andrea";
sizeof(stringa) mi torna 10
strlen(stringa) mi torna 6
il che e` corretto.
ma, nel mio caso:
[i dovuti include]
main(){
 char *s;
 s=(char *) malloc(10);
 printf("%d\n",sizeof(s));
}
ottengo sempre 4. mi servirebbe di sapere quanto spazio e` allocato
per il puntatore s.
grazie per la vostra disponibilita`,
andrea gelmini
--
Posted from 
ns.numerica.it
 [194.184.189.10]
via Mailgate.ORG Server - 
http://www.mailgate.org

 per il puntatore s.
sizeof(s) ti dice quanto spazio e' allocato per la variabile "s": nel
tuo ambiente un puntatore a carattere occupa 4 bytes [1].  Tu vuoi
sapere quanto spazio e' allocato per l'oggetto cui s punta: e questo
non e' possibile, semplicemente, in C.  Se ti serve l'informazione,
devi conservarla tu stesso, mettendo il numero di bytes (10 in questo
caso) da qualche parte.
Se l'oggetto cui punta s e' stato allocato da codice esterno su cui tu
non hai controllo, e non sei sicuro che possa contenere N bytes,
chiama la realloc(s, N).  E controlla poi se non ti restituisce
errore.
[1] Per semplicita' chiamo qui "byte" la memoria necessaria per
    conservare un carattere.  Questo peor' non e' del tutto esatto.
-- 
Maurizio Loreti                      
http://wwwcdf.pd.infn.it/~loreti/mlo.html
Un. of Padova, Dept. of Physics - Padova, Italy          
lor...@padova.infn.it

per il puntatore s.
Lo spazio allocato per il puntatore e` in effetti di 4 byte.  Lo spazio
*a cui punta*, non puoi scoprire quanto sia grande, in C Standard.
Presumibilmente lo sai al momento in cui lo spazio lo allochi, visto
che l'informazione, alla malloc, la passi tu; ebbene, dovrai passarla
in giro da qualche parte, registrarla in qualche tua tabella ad hoc,
allocare non un'array ma una struct uno dei cui campi dice a quanto
spazio punta l'altro, o altri trucchi ancora a tuo gusto.
Se non ti interessa minimamente la portabilita`, e hai il sorgente
delle librerie di runtime che usi, puoi vedere dove mette questa
info la malloc del tuo sistema, ma e` probabile che comunque la
informazione non sia esattamente quella che ti serve (di solito,
malloc arrotonda le dimensioni passate al primo superiore
multiplo di 8, o 16, byte, o simili [in alcune implementazioni, alla
potenza di 2 subito superiore...], quindi non otterresti comunque
la esatta dimensione "logicamente allocata" dal tuo programma,
ma una approssimazione che puo` sbagliare, come minimo, di
7 o 15 byte [e molto di piu` se le tue runtime usano uno schema
"a potenza di due"]).
Alex

 
mi sono trovato nella tua stessa condizione proprio ieri sera... in
effetti non e' possibile, perche' la macro sizeof ti ritorna sempre la
dimensione della variabile... in questo caso ti ritorna la dimensione
proprio di s... che e' un puntatore e quindi occupa 4 bytes...
personalmente ho risolto il problema (ma ti avverto che, in linea di
massima non dovresti farlo...) usando una variabile globale che contiene
la dimensione allocata (questo perche' dovevo trattare con un puntatore
globale ad un malloc dimensionabile a piacere da tutte le funzioni del mio
programma). Proprio perche' lavori con le globali dovresti evitare di
usare tale condizione se non e' fortemente necessaria...
in genere, potresti dichiarare una struttura del tipo
struct malloc_pointer {
	char *pt;
	int allocated;
	};
struct malloc_pointer stp;
e quindi associ a 
stp.pt
 il valore che ti ritorna il malloc o il realloc, 
e al valore allocated lo spazio allocato nel malloc in questione...
			saluti
---------------------------
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