No hay diferencia en el tamaño del bloque de memoria asignado. calloc
simplemente llena el bloque de memoria con un patrón físico de cero bits. En la práctica, a menudo se supone que los objetos ubicados en el bloque de memoria asignado calloc
tienen un valor inicial como si se inicializaran con literales 0
, es decir, los enteros deberían tener el valor de 0
variables de punto flotante - valor de0.0
punteros, el valor de puntero nulo apropiado , y así.
Sin embargo, desde el punto de vista pedante, calloc
(así como memset(..., 0, ...)
) solo se garantiza que inicializará correctamente (con ceros) objetos de tipo unsigned char
. No se garantiza que todo lo demás se inicialice correctamente y puede contener la llamada representación de trampa , lo que provoca un comportamiento indefinido. En otras palabras, para cualquier tipo que no seaunsigned char
el patrón de cero bits mencionado anteriormente, podría representar un valor ilegal, la representación de trampa.
Más tarde, en uno de los estándares técnicos de Corrigenda a C99, el comportamiento se definió para todos los tipos enteros (lo cual tiene sentido). Es decir, formalmente, en el lenguaje C actual solo puede inicializar tipos enteros con calloc
(y memset(..., 0, ...)
). Usarlo para inicializar cualquier otra cosa en un caso general conduce a un comportamiento indefinido, desde el punto de vista del lenguaje C.
En la práctica, calloc
funciona, como todos sabemos :), pero depende de usted si desea usarlo (teniendo en cuenta lo anterior). Personalmente prefiero evitarlo por completo, usarlo malloc
y realizar mi propia inicialización.
Finalmente, otro detalle importante es que calloc
se requiere para calcular internamente el tamaño final del bloque , multiplicando el tamaño del elemento por el número de elementos. Al hacerlo, calloc
debe estar atento a un posible desbordamiento aritmético. Resultará en una asignación fallida (puntero nulo) si el tamaño de bloque solicitado no se puede calcular correctamente. Mientras tanto, su malloc
versión no intenta buscar desbordamiento. Asignará una cantidad de memoria "impredecible" en caso de que ocurra un desbordamiento.
malloc