IMO uno es suficiente, ¿por qué calloc
requiere dividirlo en dos argumentos?¿Por qué calloc toma dos argumentos mientras que malloc solo uno?
Respuesta
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.
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). –
@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 ... ;-) –
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'. –
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 typedef
size_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.
Esto no responde la pregunta en absoluto. El ancho del tipo entero utilizado es completamente irrelevante para esta pregunta. – Jeff
@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. –
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
- 1. Dos argumentos para calloc
- 2. malloc prefiriendo sobre calloc
- 3. C pregunta tutorial relacionada con calloc vs malloc
- 4. método maravilloso que toma el cierre con uno o dos argumentos
- 5. ¿Por qué .Net Socket.Disconnect toma dos minutos?
- 6. generate_n con el constructor que toma dos argumentos
- 7. ¿Cómo terminaron malloc y calloc con diferentes firmas?
- 8. Diferencia en el diseño del bloque de memoria asignado por malloc y calloc?
- 9. Estoy muy confundido acerca de malloc() y calloc() en C
- 10. calloc v/s malloc y eficiencia de tiempo
- 11. ¿Por qué Python dice que pow solo tiene 2 argumentos?
- 12. ¿Calloc (4, 6) es lo mismo que calloc (6, 4)?
- 13. ¿Por qué apply() aquí solo toma un argumento en lugar de dos?
- 14. ¿Por qué PLINQ usa solo dos hilos?
- 15. Por qué malloc siempre devuelve NULL
- 16. ¿Cómo se crea una función solo de depuración que toma una lista de argumentos variables? Al igual que printf()
- 17. ¿Por qué recibo una advertencia cada vez que uso malloc?
- 18. SVN? VSS? ¿Por qué es uno mejor que el otro?
- 19. La fusión de dos filas a uno, mientras que la sustitución de los valores nulos
- 20. ¿Por qué llamar al operador sizeof con dos argumentos?
- 21. ¿Cuándo y por qué usar malloc?
- 22. ¿Por qué obtengo TypeError: get() toma exactamente 2 argumentos (1 dado)? Google App Engine
- 23. ¿Por qué os.path.join descarta argumentos?
- 24. C#: ¿Por qué LinkedList no tiene un método RemoveAll que toma un predicado?
- 25. ¿Por qué TR no toma estilo?
- 26. ¿Puedo combinar dos decoradores en uno solo en Python?
- 27. En macros C, ¿debería uno preferir hacer {...} mientras que (0,0) más hacer {...} mientras (0)?
- 28. ¿Por qué el casting proporciona CS0030, mientras que "as" funciona?
- 29. ¿Qué devuelve malloc (0)?
- 30. ¿por qué jvm tiene muchos clasloaders? ¿por qué no uno?
Debido a algún programador creado de esa manera y por lo tanto, siempre se mantuvo ... –
Si Don 'me gusta', '#define calloc (x) (calloc) (x, 1)' debería funcionar. –
@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