View Full Version : [C] ... tra CALLOC e MALLOC non ci sto capendo niente .. mi date una mano ?
ho le idee molto ma molto confuso su calloc e malloc .. mi date una mano a capire ..
come usarle ?
quando usarle ?
perchè usarle ?
se nn si usano che succede ?
ecco un esempio del prof che nn ho ben capito :
int *leggiNvalori (int numval)
{
int *A, i;
A = calloc(numval, sizeof(int));
for (i=0; i<numval; i++)
{
printf(“Inserire valore (%d): “, i);
scanf(“%d”, &A[i]);
}
return A;
}
DanieleC88
13-12-2008, 16:38
In ordine:
richiedendo il quantitativo totale di memoria richiesta (per la malloc()) o il numero di elementi necessari e la grandezza di ognuno (per la calloc())
in ogni caso in cui ti serva allocazione dinamica di memoria (in generale, quando non puoi sapere a priori l'esatto quantitativo di memoria di cui avrai bisogno)
esattamente come il punto precedente: non conosci a priori (al momento della compilazione) il quantitativo esatto di memoria da riservare, e non puoi quindi richiedere un'allocazione statica
che ottieni errori di esecuzione di vario tipo a seconda di ciò che fai (puoi usare memoria allocata staticamente e sforare dalle dimensioni massime, mandando in crash l'intero programma, e così via)
maulattu
13-12-2008, 16:49
cut
A = calloc(numval, sizeof(int));
cut
se il tuo prof insegna così siamo a posto...
http://www.lilik.it/~mirko/gapil/gapilsu22.html
bisogna testare che la variabile puntatore risultato della calloc/malloc sia diversa da NULL prima del suo reale utilizzo. Semmai ti dovesse ritornare un null, allora i segmentation fault saranno i tuoi più cari nemici ;)
oltre alla prima differenza data da daniele88, la calloc inizializza a 0 la memoria, la malloc no. In quest'ultimo caso dovresti (se ti serve) fare un memset a 0 della memoria allocata.
ah, mi raccomando, ricordati di disallocare con "free" la memoria allocata con calloc/malloc quando non ti serve più, altrimenti incorri in memory leak.
http://it.wikipedia.org/wiki/Memory_leak
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.