2010-11-22 14 views
9

Duplicar posibles:
c difference between malloc and callocmalloc prefiriendo sobre calloc

¿Hay alguna situación en la que usted prefiere malloc sobre calloc. Sé que tanto malloc como calloc asignan memoria dinámicamente y que calloc también inicializa todos los bits en la memoria asignada a cero. De esto, supongo que siempre es mejor usar calloc sobre malloc. ¿O hay algunas situaciones en las que malloc es mejor? El rendimiento puede ser?

+0

Votación para volver a abrir esta. La otra pregunta es sobre las diferencias son. Esta pregunta es diferente Pregunta por qué uno preferiría malloc (que es una práctica común). –

+0

@RaymondHettinger, si mal no recuerdo, eso no importa si sus respuestas son las mismas. –

Respuesta

19

Si necesita que la memoria asignada dinámicamente se inicialice en cero, utilice calloc.

Si no necesita la memoria asignada dinámicamente para inicializarse en cero, utilice malloc.

No siempre necesita memoria inicializada cero; si no necesita la memoria inicializada a cero, no pague el costo de inicializarla. Por ejemplo, si asigna memoria y luego copia datos inmediatamente para llenar la memoria asignada, no hay ninguna razón para realizar la inicialización cero.

calloc y malloc son funciones que hacen cosas diferentes: use la que sea más adecuada para la tarea que necesite realizar.

+0

Thanks.performance es un buen punto. También estaba interesado en saber si hay alguna otra razón posible. – user514946

+1

(Ugh ... cerraron tu pregunta, que es un poco diferente que el "duplicado" ... Odio S.O. a veces). De todos modos, hay varias razones por las que quizás quieras usar calloc sobre malloc. Uno de ellos es que programas como valgrind emitirán muchas advertencias potencialmente espurias con malloc. Otro está relacionado con la exposición de errores. El uso de memoria no inicializada puede dar como resultado un comportamiento errático que puede hacer que notes un error que de otra manera hubiera pasado desapercibido si usaras calloc. –

2

Confiar en la inicialización a cero de calloc puede ser peligroso si no tiene cuidado. La memoria de puesta a cero proporciona 0 para los tipos integrales y \ 0 para los tipos de caracteres como se esperaba. Pero no necesariamente se corresponde con los indicadores float/double 0 o NULL.

0

Normalmente está asignando memoria con la intención específica de almacenar algo allí. Eso significa que (al menos la mayoría de) el espacio inicializado en cero por calloc pronto se sobrescribirá con otros valores. Como tal, la mayoría de los códigos usan malloc por un poco de velocidad extra sin pérdida real.

Casi el único uso que he visto para calloc fue el código que (supuestamente) comparaba la velocidad de Java con respecto a C++. En la versión de C++, asignó algo de memoria con calloc, luego usó memset para inicializar la memoria nuevamente en (lo que me pareció) un intento bastante transparente de producir resultados que favorecían a Java.