utiliza usar resueltos memoria ejercicios ejemplo dinamicos dinamica como asignacion arreglos c history libc std

usar - memoria malloc



¿Cómo terminaron malloc y calloc con diferentes firmas? (1)

Posible duplicado:
¿Por qué calloc toma dos argumentos mientras que malloc solo uno?

Hay muchos recursos que describen la diferencia de funcionalidad entre malloc y calloc , pero no puedo encontrar fácilmente uno que describa la historia detrás de las diferentes firmas de funciones:

void *calloc(size_t nmemb, size_t size); void *malloc(size_t size);

Por supuesto, el size en el primero es el tamaño para cada miembro. ¿Tal vez la idea era que los callocs de tamaño de miembro de tamaño de página múltiple podrían hacerse perezosamente a través del sistema operativo?

(Puedo inventar razones así como el siguiente tipo: no se aceptan respuestas sin las fuentes citadas. :-)


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 se especifica por tamaño y cuyo valor es indeterminado.

Anteriormente, un objeto se definía en la sección 3.14 como:

Región de almacenamiento de datos en el entorno de ejecución, cuyos contenidos pueden representar valores

Por otro lado, el calloc se define en 7.20.3.1 como:

La función calloc asigna espacio para una matriz de 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).

Entonces, 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 de función solo piden cosas diferentes. Uno es pedir que se asigne un gran trozo de memoria, y me ocuparé de ello. El otro dice: "Quiero un conjunto de n cosas que son de este tamaño, dame un poco de memoria que pueda usar para este arreglo, y ponlo a cero", porque en la mayoría de las implementaciones puedo hacer buenas suposiciones sobre lo que significa la memoria puesta a cero.

El hecho de que esté intentando usarlo como malloc + zeroing es, según mi lectura de la especificación, un malentendido sobre el propósito de la función.

Terminaron con diferentes firmas porque hacen cosas diferentes.

Algunos pensamientos secundarios lindos ... Una implementación de Malloc trivial puede verse así:

#define malloc(x) (calloc(1, x))

También es divertido tener en cuenta que si mi representación de puntero NULL no se pone a cero, calloc no me devolverá una serie de punteros NULL. Mejor aún, si diseño una representación entera en la que la memoria puesta a cero no es ((int) 0), calloc no me devolverá una matriz de 0s.