Oppure

Loading
05/09/18 18:16
comtel
Buonasera ragazzi,
semplicemente vorrei sapere se esiste una scelta migliore e una peggiore di fronte all'utilizzare o la malloc o la calloc. Secondo il vostro parere personale e professionale, quale delle due funzioni di buffer manipulation è migliore e in quali casi.
aaa
05/09/18 18:44
pierotofy
calloc inizializza il blocco di memoria a zero.

malloc non inizializza il blocco di memoria.

Dipende dallo scopo. malloc e' probabilmente leggermente piu' veloce, ma devi stare attento ad inizializzare la memoria correttamente. calloc fa il lavoro per te, ma e' probabilmente un pochino piu' lento.
Il mio blog: piero.dev
05/09/18 19:04
comtel
Postato originariamente da pierotofy:

calloc inizializza il blocco di memoria a zero.

malloc non inizializza il blocco di memoria.

Dipende dallo scopo. malloc e' probabilmente leggermente piu' veloce, ma devi stare attento ad inizializzare la memoria correttamente. calloc fa il lavoro per te, ma e' probabilmente un pochino piu' lento.


Grazie mille per la tua risposta, avevo idea di una cosa del genere studiando le due funzioni. Il contesto che sto considerando in questo momento è l'allocazione dinamica di una matrice, ed il prodotto riga per colonna di due matrici.
aaa
06/09/18 8:52
Mikelius
Tieni presente che la differenza di prestazioni è spesso insignificante.
Credo che potrebbe essere influente nell'ordine delle centinaia di migliaia di elementi da allocare.
Io consiglierei calloc, ma solamente per sicurezza. Ti potresti trovare nel caso in cui malloc nel tuo pc funzioni perchè hai la fortuna che il blocco contenga (via random) un indirizzo valido, mentre su altri pc no, causando crash del programma. E' sempre bene inizzializzare le variabili, si eviteranno problermi difficili da risolvere a chi non ha molta esperienza
aaa
06/09/18 9:00
comtel
Postato originariamente da Mikelius:

Tieni presente che la differenza di prestazioni è spesso insignificante.
Credo che potrebbe essere influente nell'ordine delle centinaia di migliaia di elementi da allocare.
Io consiglierei calloc, ma solamente per sicurezza. Ti potresti trovare nel caso in cui malloc nel tuo pc funzioni perchè hai la fortuna che il blocco contenga (via random) un indirizzo valido, mentre su altri pc no, causando crash del programma. E' sempre bene inizzializzare le variabili, si eviteranno problermi difficili da risolvere a chi non ha molta esperienza


Ti ringrazio per la risposta, infatti può essere che sia incappato nell'errore che tu mi hai spiegato. Proverò ad utilizzare la calloc invece della malloc e vediamo se il problema lo risolvo. In caso contrario, dovrò per forza di cose aprire un nuovo thread sul forum per capire dove si trova il problema, che ho capito solo in parte essere o a causa della funzione malloc che ho utilizzato oppure a causa della rappresentazione dei numeri interi.
aaa
06/09/18 11:39
nessuno
Come detto la calloc è una malloc seguita da una inizializzazione. Se ti serve usi la calloc altrimenti no.

Per il resto la questione degli errori sugli indirizzi non ha alcun senso. Usa la malloc tranquillamente, se hai errori è colpa del resto del codice.
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
06/09/18 11:58
comtel
Postato originariamente da nessuno:

Come detto la calloc è una malloc seguita da una inizializzazione. Se ti serve usi la calloc altrimenti no.

Per il resto la questione degli errori sugli indirizzi non ha alcun senso. Usa la malloc tranquillamente, se hai errori è colpa del resto del codice.

Ho postato il codice alla quale faccio riferimento in questo thread in un altro thread, lo si può trovare facilmente perchè è recente. Se ti va di dargli un'occhiata e darmi la tua opinione..
aaa
06/09/18 21:17
TheDarkJuster
Una piccola osservazione: calloc in teoria può allocare più elementi in una volta sola.

Questo dipende dall'implementazione ovviamente, ma se ci pensi bene facendo
sizeof(int) * x e calloc(sizeof(int), x) potresti ottenere due risultati diversi per un x molto grande: infatti la moltiplicazione può andare in overflow, mentre una implementazione di malloc con un for permette di evitare quel tipo di overflow.

Ovviamente dipende dalla specifica implementazione di calloc quindi non puoi farci affidamento (e comunque dubito avrai necessità di allocare un numero di byte abbastanza elevato da provocare un overflow)
aaa