|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: Jul 2006
Messaggi: 38
|
[C] Differenze tra malloc() e calloc()
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? Codice:
#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;
}
p= malloc(5*sizeof(data)); ? o mi sfugge qualcosa? Grazie Andrea |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Nov 2004
Messaggi: 357
|
La calloc dopo aver allocato memoria, inizializza lo spazio indirizzato a 0
Quindi sarebbe equivalente alla malloc che hai messo, più un memset |
|
|
|
|
|
#3 | |
|
Member
Iscritto dal: Jul 2006
Messaggi: 38
|
Quote:
|
|
|
|
|
|
|
#4 |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
giusto
|
|
|
|
|
|
#5 |
|
Member
Iscritto dal: Jul 2006
Messaggi: 38
|
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
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Nov 2000
Città: MILANO
Messaggi: 2662
|
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...
|
|
|
|
|
|
#7 | |
|
Member
Iscritto dal: Jul 2006
Messaggi: 38
|
Quote:
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? |
|
|
|
|
|
|
#8 | |
|
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
Quote:
se non fosse cosí andrebbe a puttane tutta l'aritmetica dei puntatori del C Serve logica per capire un linguaggio logico
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve |
|
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Nov 2000
Città: MILANO
Messaggi: 2662
|
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?
Ultima modifica di Black imp : 12-07-2006 alle 17:19. |
|
|
|
|
|
#10 | |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Quote:
|
|
|
|
|
|
|
#11 | |
|
Senior Member
Iscritto dal: Nov 2000
Città: MILANO
Messaggi: 2662
|
Quote:
[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. Ultima modifica di Black imp : 12-07-2006 alle 18:13. |
|
|
|
|
|
|
#13 | |
|
Senior Member
Iscritto dal: Mar 2004
Messaggi: 1455
|
Quote:
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
__________________
Ciao ~ZeRO sTrEsS~ |
|
|
|
|
|
|
#14 | |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Quote:
Codice:
void *calloc(size_t num, size_t size) {
void *pv = malloc(num * size);
if (pv) {
memset(pv, 0, num * size);
}
return pv;
}
|
|
|
|
|
|
|
#15 | |
|
Senior Member
Iscritto dal: Mar 2004
Messaggi: 1455
|
Quote:
__________________
Ciao ~ZeRO sTrEsS~ |
|
|
|
|
|
|
#16 | |
|
Senior Member
Iscritto dal: Nov 2000
Città: MILANO
Messaggi: 2662
|
Quote:
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. Ultima modifica di Black imp : 12-07-2006 alle 22:51. |
|
|
|
|
|
|
#17 |
|
Bannato
Iscritto dal: Mar 2004
Città: Roma
Messaggi: 2688
|
ma queste nozioni così dettagliate dove si studiano?linguaggi e traduttori o cos'altro?
|
|
|
|
|
|
#18 | |
|
Senior Member
Iscritto dal: Nov 2000
Città: MILANO
Messaggi: 2662
|
Quote:
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. |
|
|
|
|
|
|
#19 | |
|
Senior Member
Iscritto dal: Mar 2004
Messaggi: 1455
|
Quote:
Non puoi mai fare nessuna assunzione sulla contiguità dei dati, sia per un array che per una malloc di memoria.
__________________
Ciao ~ZeRO sTrEsS~ |
|
|
|
|
|
|
#20 | |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Quote:
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. |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 23:45.



















