C-calloc () v. malloc () [duplicado]


Posible Duplicado:
c diferencia entre malloc y calloc

Por favor explique el significado de esta declaración,

Otro diferencia entre malloc() y calloc() funciones es que la memoria asignado por la función malloc( ) contiene valores de basura, mientras que la memoria asignado por la función calloc( ) contiene todos los ceros.

Source ( ' C ' Programming , Salim Y. Amdani)

Gracias

Author: Community, 2010-08-10

4 answers

De http://wiki.answers.com/Q/Is_it_better_to_use_malloc_or_calloc_to_allocate_memory

malloc() es más rápido, ya que calloc() inicializa la memoria asignada para contener todos los ceros. Dado que normalmente querría usar e inicializar la memoria usted mismo, este beneficio adicional de calloc() puede no ser necesario.

 39
Author: Edward Leno,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-08-10 13:10:00

calloc está inicializando la memoria antes de usarla, pero malloc no lo hace.

Refiérase a este enlace:

La función calloc () asignará espacio no utilizado para una matriz de nelem elementos cada uno de cuyo tamaño en bytes es elsize. El espacio será inicializado a todos los bits 0.

Con malloc, si desea garantizar el mismo efecto, tendría que llamar a algo como memset para restablecer la memoria, por ejemplo,

char* buffer = (char*)malloc(100);
memset(buffer,0,100);

calloc te ahorra ese extra paso. La importancia de inicializar la memoria es que está obteniendo una variable a un estado conocido en lugar de uno desconocido. Así que si está comprobando una variable, digamos un elemento de matriz, para un valor esperado, entonces al tener la variable preinicializada antes de tiempo, puede estar seguro de que el valor que está comprobando no es basura. En otras palabras, puede distinguir entre basura y valores legítimos.

Por ejemplo, si simplemente dejas basura en la variable y estás comprobando algún valor, digamos 42, entonces no tienes forma de saber si el valor fue realmente establecido en 42 por tu programa, o si eso es solo algo de basura sobrante porque no lo inicializaste.

 24
Author: dcp,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-08-10 13:01:47

calloc(...) es, básicamente,malloc + memset( si desea 0 inicializar la memoria)

ptr = malloc(sizeof(struct fubar));
memset(ptr, 0, sizeof (struct fubar)); //here we could use some different value instead of 0 whereas calloc always 0 initialises.

Cuando se usa malloc para asignar algo de memoria, su contenido anterior no se borra (es decir, no se inicializa). Puede obtener valores aleatorios que se establecieron cuando la máquina arrancó o puede ver parte de la memoria que pertenecía a programas que se estaban ejecutando anteriormente pero que se dejó sin borrar después de la asignación y la salida del programa.

calloc en sí mismo es más lento que malloc porque tienes que pasar algún tiempo para borrar el contenido de la memoria asignada. Así que si solo necesitas asignar algo de memoria y luego copiar algunas cosas allí, eres libre de usar malloc.

 8
Author: plaes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-09-26 08:19:01

Solo significa que si asignas memoria, con calloc(), lo que sea que asignes es 0. es decir, si asignas espacio para una matriz de enteros, todos se establecerían en 0, mientras que con malloc(), la memoria no se inicializa de ninguna manera.

Podría usar calloc en situaciones en las que solo va a hacer un memset de 0 a la memoria de todos modos.

 3
Author: Shawn D.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-08-10 12:52:53