Newsgroup: it.comp.lang.c
Titolo: domandina semplcissima su malloc

mi sfugge un' attimo l' uso di malloc....
esempio:
include <stdlib.h>
char *patch_path;
patch_path=malloc((strlen(argv[i])+1)*sizeof(char));
strcpy(patch_path,argv[i]);
free(patch_malloc);
... ma va bene? Cioč malloc restituisce il puntatore all' indirizzo dell' 
inizio della memoria allocata per contenere qualcosa grande come argv[i].
Nella linea successiva faccio puntare il suddetto puntatore alla stringa di 
caratteri contenuta in argv[i].Ora free riesce a svolegere il suo compito?
Non andrebbe usato qualcosa del tipo:
include <stdlib.h>
char *patch_path;
void *p;
p=malloc((strlen(argv[i])+1)*sizeof(char));
strcpy(patch_path,argv[i]);
free(p);
?
Fatemi sapere :D
Stefano Pelux

 free(p);
Questo non va bene, perchè patch_path non è inizializzato e punta ad un
indirizzo qualunque, se tu ci fai una strcpy sopra vai a sovrascrivere su
aree di memoria su cui non puoi scrivere... per quale motivo pensi che sia
meglio?
In generale la malloc non fa altro che allocare la quantità di memoria che
tu passi per argomento, e ritorna un puntatore void* al primo indirizzo
della memoria allocata; quando assegni il valore ritornato ad un altro
puntatore la memoria viene castata automaticamente al puntatore corretto.
Per non aver problemi, è utile usare una notazione del genere:
p = malloc((strlen(argv[i])+1)*sizeof(*p));
                                                        ^^^
in questo modo sei certo di allocare la quantità di memoria esatta per il
tipo di dato di p.
Ciao,
Cecco

 meglio?
Avevo fatto un interpretazione differente... Pensavo che malloc allocasse 
la memoria e fornisse un puntatore il cui unico scopo fosse di tenere in 
mente l' indirizzo per potere liberarlo con free.
Invece (da quanto ha capito) serve a "inizializzare" un puntatore 
passandogli l' area di memoria su cui scriverai con strcpy... 
solo...pensavo che facendo ad esempio
char *p;
p = "testa_bacata";
Io facessi puntare p all' indirizzo (gia definito!) riservato alle lettere 
"testa bacata" ... invece sembra che con strcpy io faccia una copia vera e 
propria ... e questo non dovrebbe avvenire usando un char vettore[] = 
"testa_bacata" ? 
Non riesco a capire la logica di fondo...se qualcuno sa indirizzarmi su 
dove posso leggere qualcosa al riguardo lo ringrazio anticipatamente!
Stefano Pelux

 dove posso leggere qualcosa al riguardo lo ringrazio anticipatamente!
Più che altro non ho capito bene cosa non ti torna.
Ciao,
Cecco

 Cecco
Dunque... innanzitutto grazie dell' aiuto... 
Quello che non mi torna è:
1) ma allora che differenza sussite fra il puntatore e il vettore di 
caratteri ? (nessuna?) (su K&R non mi pare fosse cosi)
2) QUANDO va usato malloc e quando invece non serve? (voglio dire.. non lo 
usa mica sempre, in genre il compilatore gestisce gli spazi di memoria 
autonomamente... tipo quando dichiaro un vettore definito...)
3) quindi free conserva da solo lo spazio che malloca ha allocato e non 
conta piu a cosa punta il puntatore restituito da malloc al momento in cui 
chiamo free ? (io pensavo infatti che il puntatore servisse a 
quello)....come fa free a capire cosa deve liberare se a quel punto il 
puntaore con strcpy punta ad altro e non piu all' indirizzo della memoria a 
lui riservata?
4) COSA fa esattamente malloc? Restituisce un punatore all' inizio di un' 
area di memoria libera di una certa dimensione, giusto? E a questo punto si 
ritorna al punto precedente, se il puntaore poi punta ad altro come lavora 
free? Basta che il punatatore rimanga ALL' INTERNO dell' area di memoria 
assegnata?
Grazie Mille! 
Stefano Pelux -che intanto sta cercado di capire come funzia getopt()

 Stefano Pelux -che intanto sta cercado di capire come funzia getopt()
Quì invece non ti posso aiutare: getopt() non è una funzione standard.
Ciao,
Cecco