Newsgroup: it.comp.lang.c
Titolo: Realizzare una semplice funzione " check&malloc() "

Ciao a tutti, non sono molto esperto di puntatori a void e mi chiedevo
quale fosse un modo valido di creare una semplice funzione che alloca
memoria per tipi di dato base (intendo semplici tipi di dato per cui
basta conoscere la dimensione in byte per allocare loro memoria) e si
occupa di verificare che il puntatore tornato dalla malloc non sia nullo.
versione base (trascuro le #include per brevità):
--------------------
/* torna un puntatore ad un'area di memoria di byte_num byte e gestisce
l'eventuale errore terminando l'esecuzione del programma */
void *c&m(int byte_num){
void *p_mem;
	if(  (p_mem=malloc(byte_num))==NULL  ){
        		puts("Errore nell'allocazione della memoria");
        		exit(ERROR_MEM_CODE);
       	}
return p_mem;
}
----------------------
Il cliente (trascuro gran parte del codice per brevità:
--------------------
int *arr1;
	arr1=c&m(10);	/* alloco per arr1 10 bytes */
--------------------
Può andare? Avete dei consigli per migliorarla? E' necessario fare un 
cast esplicito alla c&m() nel cliente? es.: arr1= (int*) c&m(10);
  ciao e grazie, rz
-- 
                                   /TYDIRIUM - Ferrara - ITALY\
                                   \ICQ#    13901251   !!bye!!/
"What we're seeing with Web sites that are viewable only with IE is the
privatization of the Web."        (Mitchell Baker)

 
Ho corretto qualche piccolo errore e non mi sembra funzioni male o in
modo inaspettato, ciň non vuol dire che sia un codice corretto o privo 
di bug come spesso capita usando i puntatori senza avere grande 
dimestichezza. L'ultimo dubbio che mi č rimasto č se sia consigliabile o 
inutile il cast esplicito nel cliente:
arr1= (int*) c&m(10);
Ovvero, se si riceve da una funzione un puntatore a void e lo si vuole 
assegnare ad un puntatore di un tipo ben preciso, ad esempio int, č 
consigliabile/necessario/inutile fare una cast esplicito (int*)?
  ciao e grazie anticipatamente per le risposte, rz
-- 
                                   /TYDIRIUM - Ferrara - ITALY\
                                   \ICQ#    13901251   !!bye!!/
"Analizzando e valutando ogni giorno tutte le idee, ho capito che spesso 
tutti sono convinti che una cosa sia impossibile, finchč arriva uno 
sprovveduto che non lo sa e la realizza." (A. Einstein)

 consigliabile/necessario/inutile fare una cast esplicito (int*)?
Inutile, dato che i void* sono trattati in modo che si possano assegnare 
a qualunque puntatore.
-- 
Devaraja (Xdevaraja87^gmail^c0mX)
Linux Registerd User #338167
http://counter.li.org

 
Ho capito, grazie!
  ciao, rz.

consigliabile/necessario/inutile fare una cast esplicito (int*)?
E' inutile, il cast da void* a T*, per qualunque T tipo di dato, è
automatico.

 Può andare? Avete dei consigli per migliorarla?
Ciao,
 aggiungo due cosine a quanto gia' detto:
1) quanto occupa un int sulla tua architettura? Sicuro che allocare 10
   byte per un array di interi sia sensato? Sarebbe piu' pulito decidere
   quanti interi vuoi (Nint) e poi fare:
	arr1 = c_m (Nint * sizeof (int));
2) ottima cosa il check, ma se fallisce direi che "abort" e' meglio ...  
   a meno che _tutto_ il resto del codice sia protetto contro
   l'eventualita' di memoria esaurita, temo che l'exit ti porti ad un
   segmentation fault.
 Ciao
 Federico

  Federico
