2011-09-24 11 views
8

IMO uno es suficiente, ¿por qué calloc requiere dividirlo en dos argumentos?¿Por qué calloc toma dos argumentos mientras que malloc solo uno?

+10

Debido a algún programador creado de esa manera y por lo tanto, siempre se mantuvo ... –

+1

Si Don 'me gusta', '#define calloc (x) (calloc) (x, 1)' debería funcionar. –

+5

@Chris utilizando el preprocesador para redefinir malloc o familia parece una muy mala idea (excepto tal vez para depurar la asignación de memoria). – ssube

Respuesta

3

Los nombres de los parámetros documentan razonablemente bien:

void *malloc(size_t size); 
void *calloc(size_t nelem, size_t elsize); 

La última forma permite la ordenada el que se distribuyen de arrays, proporcionando el número de elementos y el tamaño del elemento. El mismo comportamiento se puede lograr con malloc, multiplicando.

Sin embargo, calloc también inicializa la memoria asignada a 0. malloc no inicia, por lo que el valor no está definido. malloc puede ser más rápido, en teoría, debido a que no se configura toda la memoria; esto solo se observará con grandes cantidades.

En this question, se sugiere que calloc es claro-alloc y malloc es mem-alloc.

+4

Otro beneficio de dos argumentos es el potencial para la verificación de desbordamiento, normalmente difícil (y raramente hecho) con' malloc' (aunque si está asignando objetos del tamaño que podría desbordarse podría estar haciendo mal). –

+1

@Chris: Tal vez necesitemos un 'cccalloc' que tome 6 argumentos y asigne' a * b + c * d + e * f' bytes con control de desbordamiento en todas las subexpresiones ... ;-) –

+6

No creo que esta es una respuesta a la pregunta. Esto no pregunta cómo funcionan (entonces sería un duplicado y debería cerrarse). Pide el razonamiento de dividir el argumento en dos, en lugar de tener solo un tamaño total en cuanto a 'malloc'. –

5

Supongo que esto es probablemente historia y es anterior a los tiempos en que C tenía prototipos para funciones. En estos tiempos sin un prototipo, los argumentos básicamente tenían que ser int, el typedefsize_t probablemente aún no se había inventado. Pero entonces INTMAX es el trozo más grande que puede asignar con malloc y dividirlo en dos solo le da más flexibilidad y le permite asignar matrices realmente grandes. Incluso en esos momentos, había métodos para obtener páginas grandes del sistema que estaban cerradas por defecto, por lo que la eficiencia no era tanto un problema con calloc que con malloc.

Hoy en día, con size_t y el prototipo de función a la mano, esto es sólo un recordatorio diario de la rica historia de C.

+0

Esto no responde la pregunta en absoluto. El ancho del tipo entero utilizado es completamente irrelevante para esta pregunta. – Jeff

+0

@Jeff, ¿puedes explicarlo? No estoy diciendo que el ancho del tipo entero que se usa hoy tenga algo que ver con eso. Estoy diciendo que en el momento en que se creó la interfaz, podría haber sido un problema. –

+0

Me opongo a la sugerencia de que sea para "matrices realmente grandes". Es un mal diseño de API utilizar dos argumentos en lugar de uno. ¿Y por qué alguien querría 'calloc' un puntero que no podrían subsecuentemente' realloc' arbitrariamente o, sobre lo cual no podrían usar, p. 'memset' o' memcpy'? Siéntete libre de molestarte con mi pedantería, pero sería razonable decir algo sobre el tamaño de() que regresan sin signo y la asignación de matrices _muy ligeramente_ más grandes que 'INT_MAX'. – Jeff

Cuestiones relacionadas