2010-02-06 12 views
9

Estoy siguiendo esto tutorial (http://theocacao.com/document.page/234). Estoy confundido acerca de este párrafo, principalmente las líneas relacionadas con calloc:C pregunta tutorial relacionada con calloc vs malloc

También podemos usar una variación de la función malloc, llamada calloc. La función calloc toma dos argumentos, un recuento de valores y el tamaño del valor base. También borra la memoria antes de devolver un puntero, que es útil para evitar un comportamiento impredecible y se estrella en ciertos casos:

Esa última línea me confunde. ¿Qué significa borrar la memoria?

Respuesta

20

La función calloc asegurará que todos los bytes en la memoria devuelta estén configurados en 0. malloc no ofrece tales garantías. Los datos que devuelve pueden y consistirán en datos aparentemente aleatorios.

La distinción es muy útil para la inicialización de miembros de datos. Si 0 es un buen valor por defecto para todos los valores en una estructura, entonces calloc puede simplificar la creación de estructuras.

Foo* pFoo = calloc(1, sizeof(Foo)); 

vs

Foo* pFoo = malloc(sizeof(Foo)); 
pFoo->Value1 = 0; 
pFoo->Value2 = 0; 

nulo comprobación omitido para mayor claridad.

+0

... con la consecuencia de que si * usted * no inicializa correctamente la memoria, obtiene resultados impredecibles. – dmckee

+0

Si también va a usar 'realloc()', debe manejar el hecho de que la memoria extra no está puesta a cero, por lo que probablemente necesite su código de inicialización para realizar el trabajo a fondo (suficiente). Obviamente, si 'calloc()' la memoria y nunca 'realloc()', entonces esto no importa. –

+1

"constará de datos aparentemente aleatorios" - para ciertos valores de "aleatorio".Probablemente, las pruebas estadísticas podrán distinguirlo de las muestras sucesivas de una variable aleatoria discreta distribuida uniformemente sobre el rango 0 ... UCHAR_MAX ;-) –

7

Para ser exactos:

que es útil para evitar comportamiento impredecible y se estrella en ciertos casos

será la siguiente:

que es útil en la ocultación impredecible comportamiento y bloqueos en ciertos casos

4

"Borrar la memoria" en este caso significa rellenarlo con un patrón físico de bit cero. Tenga en cuenta que, desde el punto de vista formal, este tipo de inicialización de memoria sin formato solo está garantizado para trabajar con tipos integrales. Es decir. se garantiza que los objetos de tipos integrales reciban valores iniciales de cero. Si cualquier otro tipo se inicializará significativamente con esto, está definido por la implementación. (Se necesitan estándares adicionales que vayan más allá de los límites del estándar C para ofrecer garantías adicionales. POSIX, IEEE 754, etc.)

Si usar calloc para "evitar bloqueos" como se describe en la cita realmente tiene sentido es una pregunta diferente . Diría que de hecho puede mejorar la estabilidad del código escrito por programadores perezosos en un sentido que doblará todos los posibles comportamientos inesperados desencadenados por varios valores basura en un comportamiento inesperado específico desencadenado por valores cero.

Cuestiones relacionadas