View Full Version : [C] Differenze tra malloc() e calloc()
Free/Sbin
12-07-2006, 11:13
Ragazzi che differenze ci stanno tra la funzione malloc() e la funzione calloc() a me sembrano veramente molto simili:
questo esempio che fà? alloca un array formato da 5 elementi di tipo struct data, giusto?
#include <stdio.h>
#include <stdlib.h>
struct data{
char nome[20];
char cognome[20];
int anni;
};
typedef struct data data;
int main(){
data *p;
p = (data *)calloc(5, sizeof(data));
free(p);
return 0;
}
ma non sarebbe stata esattamente la stessa cosa se avessi fatto:
p= malloc(5*sizeof(data)); ? o mi sfugge qualcosa?
Grazie
Andrea
La calloc dopo aver allocato memoria, inizializza lo spazio indirizzato a 0
Quindi sarebbe equivalente alla malloc che hai messo, più un memset
Free/Sbin
12-07-2006, 11:20
La calloc dopo aver allocato memoria, inizializza lo spazio indirizzato a 0
Quindi sarebbe equivalente alla malloc che hai messo, più un memset
mmm questa cosa non l'abbiamo studiata...in pratica (se ho capito bene quello che mi hai detto) la calloc mi crea il vettore di 5 strutture e inizializza ogni campo delle 5 strutture a 0 e invece con la malloc avrei dovuto usare la funzione memset per fare tale cosa? giusto o non c'ho capita una fava? :)
Free/Sbin
12-07-2006, 11:37
ah grazie a tutti e due...hehe domani orale...allo scritto non sò coemsia possibile ma ho preso 28...ahhhspero di mantenere anche se mi sento un po' impedito su tante cose
Black imp
12-07-2006, 11:38
sono sicuro che la calloc alloca in modo contiguo. la malloc non credo allochi lo spazio in modo contiguo. quindi se fai una lista puntata da un puntatore p e la allochi con la malloc anzichè con una calloc, se cerchi di accedere ad un suo elemento con *(puntatore+13) non sai bene che cosa andrai a leggere. ma non sono sicurissimo anzi lo chiedo io a mia volta...
Free/Sbin
12-07-2006, 11:53
sono sicuro che la calloc alloca in modo contiguo. la malloc non credo allochi lo spazio in modo contiguo. quindi se fai una lista puntata da un puntatore p e la allochi con la malloc anzichè con una calloc, se cerchi di accedere ad un suo elemento con *(puntatore+13) non sai bene che cosa andrai a leggere. ma non sono sicurissimo anzi lo chiedo io a mia volta...
mmm sapevo anche io che calloc() allocava in modo contiguo...ora però non vorrei dire una cavolata...ma se alloco dinamicamente un vettore con malloc() il vettore in quanto tale è contiguo....allora anche malloc() alloca in modo contiguo? o alloca in tale modo solo per i vettori perchè è una loro proprietà e su una lista concatenata tale discorso non vale più?
attendo risposte anche io...cosa interessante :-)
Quindi come prestazioni sarebbe meglio calloc() anche perchè dovrie fare meno salti nella memoria se fosse confermata tale tesi?
trallallero
12-07-2006, 14:02
mmm sapevo anche io che calloc() allocava in modo contiguo...ora però non vorrei dire una cavolata...ma se alloco dinamicamente un vettore con malloc() il vettore in quanto tale è contiguo....allora anche malloc() alloca in modo contiguo? o alloca in tale modo solo per i vettori perchè è una loro proprietà e su una lista concatenata tale discorso non vale più?
attendo risposte anche io...cosa interessante :-)
Quindi come prestazioni sarebbe meglio calloc() anche perchè dovrie fare meno salti nella memoria se fosse confermata tale tesi?
mi sembra ovvio che allochi un blocco di memoria ;)
se non fosse cosí andrebbe a puttane tutta l'aritmetica dei puntatori del C :eek:
Serve logica per capire un linguaggio logico :D
Black imp
12-07-2006, 16:17
trallallero premesso che odio le persone saccenti, hai almeno capito qual è il problema che ci stiamo ponendo? hai mai sentito parlare di frammentazione? ti sembra un dubbio stupido?
trallallero premesso che odio le persone saccenti, hai almeno capito qual è il problema che ci stiamo ponendo? hai mai sentito parlare di frammentazione? ti sembra un dubbio stupido? e la calloc impedisce la frammentazione? ma per favore...
Black imp
12-07-2006, 16:59
e la calloc impedisce la frammentazione? ma per favore...
non ne ho idea per questo lo chiedo anche se è probabile che si allochi sempre per blocchi in ram perchè non ci sono altri puntatori che recuperino i possibili cluster come nei file. è il modo saccente di rispondere che mi sembra decisamente fuori luogo
[EDIT] mi sono risposto da solo. l'allocazione è per forza contigua solo che la malloc considera solo la dimensione totale mentre la calloc distingue gli elementi della lista e li inizializza.
forse torna utile quanto detto QUI (http://lagash.dft.unipa.it/AL/al201.htm) a centro pagina..
ciao
beppegrillo
12-07-2006, 17:36
non ne ho idea per questo lo chiedo anche se è probabile che si allochi sempre per blocchi in ram perchè non ci sono altri puntatori che recuperino i possibili cluster come nei file. è il modo saccente di rispondere che mi sembra decisamente fuori luogo
[EDIT] mi sono risposto da solo. l'allocazione è per forza contigua solo che la malloc considera solo la dimensione totale mentre la calloc distingue gli elementi della lista e li inizializza.
credo che si dovrebbe scindere l'indirizzo virtuale da quello fisico.
Quando mallochi vedi n locazioni di celle contigue, però quelle locazioni in memoria possono essere disitrubite come gli pare.
Spero di non aver detto cavolate :D
credo che si dovrebbe scindere l'indirizzo virtuale da quello fisico.
Quando mallochi vedi n locazioni di celle contigue, però quelle locazioni in memoria possono essere disitrubite come gli pare.
Spero di non aver detto cavolate :D ma questo discorso, oltre che essere esposto in maniera imprecisa, non c'entra una beata con le differenze tra malloc e calloc; calloc non è altro che questa cosa qui:
void *calloc(size_t num, size_t size) {
void *pv = malloc(num * size);
if (pv) {
memset(pv, 0, num * size);
}
return pv;
}
beppegrillo
12-07-2006, 19:26
ma questo discorso, oltre che essere esposto in maniera imprecisa, non c'entra una beata con le differenze tra malloc e calloc; calloc non è altro che questa cosa qui:
void *calloc(size_t num, size_t size) {
void *pv = malloc(num * size);
if (pv) {
memset(pv, 0, num * size);
}
return pv;
}
Infatti la mia risposta non era data alla differenza tra malloc e calloc, ma sulla definizione "per forza contigua" riferita alla memoria inizializzata con malloc o calloc.
Black imp
12-07-2006, 21:48
credo che si dovrebbe scindere l'indirizzo virtuale da quello fisico.
Quando mallochi vedi n locazioni di celle contigue, però quelle locazioni in memoria possono essere disitrubite come gli pare.
Spero di non aver detto cavolate :D
prima infatti avevo il dubbio poi però...
il fatto che gli indirizzi siano virtuali non cambia niente sono solo traslati ma sommati alla base di rilocazione danno l'indirizzo corretto e sono tutti shiftati della stessa quantità - salvo alcuni casi -. il concetto è che effettivamente non ha senso pensare che la malloc allochi non contiguamente... dove mai sarebbero i puntatori che recuperano i vari 'cluster' ? e come accedervi?? no no è necessariamente contigua.
D4rkAng3l
12-07-2006, 21:57
ma queste nozioni così dettagliate dove si studiano?linguaggi e traduttori o cos'altro?
Black imp
12-07-2006, 22:03
ma queste nozioni così dettagliate dove si studiano?linguaggi e traduttori o cos'altro?
io le ho fatte tanto tempo fa in info1 in cui dovevamo saper tradurre in assembly i meccanismi di chiamata alle funzioni fatte in modula2, poi le ho riviste un po' in ingegneria del software e poi leggendo un manuale del nasm.
beppegrillo
12-07-2006, 22:15
prima infatti avevo il dubbio poi però...
il fatto che gli indirizzi siano virtuali non cambia niente sono solo traslati ma sommati alla base di rilocazione danno l'indirizzo corretto e sono tutti shiftati della stessa quantità - salvo alcuni casi -. il concetto è che effettivamente non ha senso pensare che la malloc allochi non contiguamente... dove mai sarebbero i puntatori che recuperano i vari 'cluster' ? e come accedervi?? no no è necessariamente contigua.
Conosci la tabella delle pagine?
Non puoi mai fare nessuna assunzione sulla contiguità dei dati, sia per un array che per una malloc di memoria.
ma queste nozioni così dettagliate dove si studiano?linguaggi e traduttori o cos'altro? a studiarle a cazzo ovunque: le leggi pure qui sul forum, oppure anche all'università; ma se (giustamente) invece ci tieni a saperle bene, puoi affidarti solo alle documentazioni ufficiali, come faccio io.
la documentazione ufficiale di Windows è MSDN; quella ufficiale dell'architettura Intel a 32 bit sono i famosi manuali Intel scaricabili gratuitamente in PDF dal sito Intel. e così via.
Conosci la tabella delle pagine?
Non puoi mai fare nessuna assunzione sulla contiguità dei dati, sia per un array che per una malloc di memoria. stai cavillando sulla differenza tra spazio lineare e spazio fisico
raramente un blocco di memoria è contiguo fisicamente (e la situazione di contiguità può anche cambiare nel tempo), ma deve sempre esserlo linearmente
le assunzioni sulla contiguità dei dati puoi farle o non farle, tanto il meccanismo della memoria virtuale è completamente trasparente a meno che non stai scrivendo un driver che lavora in situazioni in cui l'interrupt che gestisce i page fault è mascherata (in Windows: IRQL >= DISPATCH_LEVEL)
trallallero
13-07-2006, 07:05
trallallero premesso che odio le persone saccenti, hai almeno capito qual è il problema che ci stiamo ponendo? hai mai sentito parlare di frammentazione? ti sembra un dubbio stupido?
saccenti ? io ? esistono le faccine apposta eh, prova ad interpretarle correttamente.
E comunque ad odiare qualcuno, questo l'ho imparato a Roma, fai doppia fatica ...
t'encazzi te scazzi ;)
E comunque ad odiare qualcuno, questo l'ho imparato a Roma, fai doppia fatica ...
t'encazzi te scazzi ;) enfatti :huh:
se posso dire la mia, sicuramente l'unica differenza esistente tra la malloc e la calloc riguarda il fatto che la seconda azzera l'area di memoria appena allocata, mentre nel primo caso ritrovi una serie di dati non prevedibili..
Lavoro sotto Linux e posso sicuramente garantirvi che le librerie malloc() usate in tale ambito non prevedono assolutamente la possibilità che un certo quantitativo di memoria allocato venga splittato e gestito in lista..
Quindi se richiedo l'allocazione di TOT byte e non esiste alcuno spazio contiguo di memoria >= TOT byte, la malloc semplicemente fallisce..
Viene tenuta una lista circolare delle aree libere, che vengono eventualmente ricompattate in caso di due aree adiacenti per gestire il problema della frammentazione dell'heap..
Viene tenuta una lista circolare delle aree libere, che vengono eventualmente ricompattate in caso di due aree adiacenti per gestire il problema della frammentazione dell'heap.. per "ricompattare" intendi a livello fisico o lineare/logico? al primo è inutile, al secondo impossibile... a meno che non ho capito male cosa intendi con "ricompattare"
per "ricompattare" intendi a livello fisico o lineare/logico? al primo è inutile, al secondo impossibile... a meno che non ho capito male cosa intendi con "ricompattare"
intendo dire che se hai due aree contigue tra di loro, nello spazio di indirizzamento logico, e che sono state entrambe liberate, nella lista dei blocchi liberi non avrei due descrittori separati, ma semplicemente un unico descrittore che avrà come campo grandezza la somma di questi due...
intendo dire che se hai due aree contigue tra di loro, nello spazio di indirizzamento logico, e che sono state entrambe liberate, nella lista dei blocchi liberi non avrei due descrittori separati, ma semplicemente un unico descrittore che avrà come campo grandezza la somma di questi due... ah ok, allora avevo capito male io... ^^
Viene tenuta una lista circolare delle aree libere, che vengono eventualmente ricompattate [...] avevo capito che il "che" si riferiva alle aree libere, non alle entries della lista circolare :fagiano:
si scusa...avevo scritto male io...
Black imp
17-07-2006, 15:54
saccenti ? io ? esistono le faccine apposta eh, prova ad interpretarle correttamente.
E comunque ad odiare qualcuno, questo l'ho imparato a Roma, fai doppia fatica ...
t'encazzi te scazzi ;)
quello che dite a Roma non mi interessa. se scrivi "Serve logica per capire un linguaggio logico " significa dire all'altro che non ha logica e non mi sembra il caso di dare lezioni ad alcuno. forse era un modo un po' pungente di fare una battuta però non meravigliarti se questo tipo di spirito non piace a tutti perchè di fatto è saccenza a meno di non essere in amicizia. senza odio eh :)
quello che dite a Roma non mi interessa. blah blah blah senza odio eh :) eh, sennò fai doppia fatica... :mc:
se scrivi "Serve logica per capire un linguaggio logico " significa dire all'altro che non ha logica no :fagiano:
significa che per capire un linguaggio di programmazione servono capacità logiche
coda di paglia? :asd:
e non mi sembra il caso di dare lezioni ad alcuno. questa era la lezione numero 1? :rolleyes:
forse era un modo un po' pungente di fare una battuta mannò, stava solo pontificando un po' :p
sei tu che ti crei i tuoi universi nella tua testa
però non meravigliarti se questo tipo di spirito non piace a tutti perchè di fatto è saccenza a meno di non essere in amicizia. sega per sega, si potrebbe dire lo stesso di te :D
norman900
18-07-2006, 01:20
e tu coding credi di "possedere" capacità logiche ?
La logica, in quanto tale, è una transizione da necessità a soddisfazione e non è di certo una capacità.
Per me la precedente battuta sarcastica aveva un grossolano sapore classista.
Black imp
18-07-2006, 04:17
eh, sennò fai doppia fatica... :mc:
no :fagiano:
significa che per capire un linguaggio di programmazione servono capacità logiche
coda di paglia? :asd:
...
tra simili ci si capisce.
trallallero
18-07-2006, 07:28
tra simili ci si capisce.
piano con le offese :mbe: io simile a quello li ?
io sono almeno 71104 + 1 :O
ancora ci penso ... saccente io ? io ? una persona cosí perfetta :O
mica é colpa mia se so tutto :D
e tu coding credi di "possedere" capacità logiche ?
La logica, in quanto tale, è una transizione da necessità a soddisfazione e non è di certo una capacità. ma abbiamo un filosofo qui tra noi :huh:
Per me la precedente battuta sarcastica aveva un grossolano sapore classista. come che so, un retrogusto
tra simili ci si capisce. io non assomiglio a lui, assomiglio al suo avatar :huh:
poi se lui vuole assomigliare allo stupido numero che ho come nick... :asd:
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.