2010-11-22 5 views
9

Possible en double:
c difference between malloc and callocpréférant malloc sur calloc

Y at-il une situation où vous préférez malloc plus calloc. Je sais que malloc et calloc allouent dynamiquement de la mémoire et que calloc initialise tous les bits de la mémoire allouée à zéro. De cela, je pense qu'il est toujours préférable d'utiliser calloc sur malloc. Ou y a-t-il des situations où malloc est meilleur? La performance peut être?

+0

Voter pour rouvrir celui-ci. L'autre question concerne les différences. Cette question est différente. Il demande pourquoi on préférerait malloc (ce qui est une pratique courante). –

+0

@RaymondHettinger, si je me souviens bien, cela n'a pas d'importance si leurs réponses sont les mêmes. –

Répondre

19

Si vous souhaitez que la mémoire allouée dynamiquement soit initialisée à zéro, utilisez calloc.

Si vous n'avez pas besoin que la mémoire allouée dynamiquement soit initialisée à zéro, utilisez malloc.

Vous n'avez pas toujours besoin d'une mémoire initialisée à zéro; Si vous n'avez pas besoin de la mémoire initialisée à zéro, ne payez pas le coût de l'initialisation. Par exemple, si vous allouez de la mémoire, puis copiez immédiatement des données pour remplir la mémoire allouée, il n'y a aucune raison d'effectuer une initialisation zéro.

calloc et malloc sont des fonctions qui font différentes choses: utilisez celle qui est la plus appropriée à la tâche que vous devez accomplir.

+0

Merci.performance est un bon point. Je voulais aussi savoir s'il y avait une autre raison possible. – user514946

+1

(Ugh ... ils ont fermé votre question, qui est légèrement différente de la "duplicate" ... Je déteste S.O. parfois.) Quoi qu'il en soit, il y a plusieurs raisons pour lesquelles vous souhaitez utiliser calloc sur malloc. Le premier est que des programmes comme valgrind émettront de nombreux avertissements potentiellement erronés avec malloc. Un autre est lié à l'exposition des bogues. L'utilisation de mémoire non initialisée peut entraîner un comportement erratique susceptible de vous faire remarquer un bogue qui serait autrement passé inaperçu si vous utilisiez calloc. –

2

S'appuyer sur l'initialisation de zéro de calloc peut être dangereux si vous ne faites pas attention. La mise à zéro de la mémoire donne 0 pour les types entiers et \ 0 pour les types de char comme attendu. Mais cela ne correspond pas nécessairement aux pointeurs float/double 0 ou NULL.

0

Vous allouez normalement de la mémoire avec l'intention spécifique d'y stocker quelque chose. Cela signifie (au moins la plus grande partie) de l'espace initialisé par calloc sera bientôt remplacé par d'autres valeurs. En tant que tel, la plupart du code utilise malloc pour un peu de vitesse supplémentaire sans perte réelle. Presque la seule utilisation que j'ai vue pour calloc était le code qui était (soi-disant) un banc d'essai de la vitesse de Java par rapport à C++. Dans la version C++, il allouait de la mémoire avec calloc, puis utilisait memset pour initialiser à nouveau la mémoire dans (ce qui me semblait) une tentative assez transparente de produire des résultats qui favorisaient Java.