Esto es algo abierto a la interpretación del lenguaje utilizado en la especificación C.
El lenguaje aquí parece muy cuidadosamente elegido - malloc se define en la sección 7.20.3.3 como:
La función malloc asigna espacio para un objeto cuyo tamaño es especificado por tamaño y cuyo valor es indeterminado.
principios de un objeto se define en la sección 3.14 como:
región de almacenamiento de datos en el entorno de ejecución, los contenido de las cuales pueden representar valores
calloc por otra parte se define en 7.20.3.1 como:
La función calloc asigna espacio para una matriz de los objetos nmemb, cada uno de cuyo tamaño es el tamaño. El espacio se inicializa a todos los bits cero.
Esto debería hacerlo obvio. La diferencia entre calloc y malloc es que calloc asigna memoria para una matriz de n objetos conceptuales, aunque en la práctica esto no es diferente de una llamada a malloc que asigna espacio para 1 objeto conceptual de tamaño (n * tamaño).
Así que la siguiente pregunta es ... ¿cuál es la necesidad de distinguir entre el espacio para una matriz de objetos y el espacio para un objeto grande?
Desde la perspectiva de los programadores, las dos llamadas a funciones solo piden cosas diferentes. Uno está pidiendo que se le asigne un gran trozo de memoria, y me ocuparé de ello. El otro dice: quiero una serie de n cosas que son de este tamaño, darme algo de memoria que pueda usar para esta matriz y ponerla a cero, porque en la mayoría de las implementaciones puedo hacer buenas suposiciones sobre lo que significa la memoria cero.
El hecho de que esté tratando de usarlo como malloc + zeroing es, al leer la especificación, un malentendido sobre el propósito de la función.
Terminaron con diferentes firmas porque hacen cosas diferentes.
Algunos pensamientos secundarios lindo ... Una implementación de malloc trivial puede parecer:
#define malloc(x) (calloc(1, x))
También es divertido tener en cuenta que si mi representación puntero NULL no se pone a cero, entonces no lo hará calloc devuélveme una matriz de punteros NULL. Mejor aún, si diseño una representación entera en la que la memoria cero no es ((int) 0), calloc no me devolverá una matriz de 0.
Extremadamente relacionado: http://stackoverflow.com/q/7536413/142019 –
No hay citas, así que solo un comentario: la firma 'calloc' es más útil, ya que una implementación adecuada verifica el desbordamiento al multiplicar, aliviando el llamador de la responsabilidad. Sospecho una de dos explicaciones: (1) 'malloc' fue lo primero, y es solo una cuestión de compatibilidad, (2)' calloc' se espera que sea más lento debido a la puesta a cero, y alguien pensó que el control de multiplicación y desbordamiento en 'malloc' se debe omitir para la velocidad. –
Me resulta extraño que una pregunta se pueda cerrar como un duplicado exacto de una pregunta menos específica sin respuestas satisfactorias (o aceptadas). Me pregunto cómo surgieron las dos firmas históricamente. – cdleary