2012-09-19 8 views
9

calloc asigna num bloques de memoria, cada uno de tamaño size:Diferencia en el diseño del bloque de memoria asignado por malloc y calloc?

void * calloc (size_t num, size_t size);

asignar espacio para matriz en la memoria asigna un bloque de memoria para una matriz de elementos num, cada uno de ellos tamaño bytes de longitud e inicializa todos sus bits a cero.

En contraste, malloc asigna un bloque de memoria de tamaño size:

void * malloc (size_t size);

Asignar bloque de memoria asigna un bloque de bytes de tamaño de memoria, devolviendo un puntero a la comienzo del bloque.


¿Hay alguna diferencia entre ambos (a excepción del cero inicialización por calloc)?

¿Qué significa calloc exactamente por num bloques de memoria como en la práctica la región de memoria devuelta es contigua también.

Creo que tiene que haber alguna diferencia, de lo contrario no tendría mucho sentido definir dos interfaces diferentes para estos métodos.

+0

sí, es por eso que ni siquiera intenté pensar que la memoria no es contigua. Entonces, ¿eso significa que la terminología, n bloques de memoria, es un error? –

+0

@AvantikaSk Sí, eso es un error. – nos

+1

En realidad, calloc asigna un solo bloque de memoria adecuado para almacenar una matriz de elementos de tamaño n. En la mayoría de las implementaciones, calloc llama a malloc y luego pone a cero la memoria. Creo que tienen dos prototipos diferentes por accidente y son diferentes solo porque calloc pone a cero la memoria. –

Respuesta

1

En la práctica, hacen lo mismo. La ventaja de calloc es que las buenas implementaciones realizarán una detección de desbordamiento al realizar la multiplicación necesaria para determinar la cantidad de memoria que necesita.

Si lo haces algo como esto:

void * 
calloc(size_t nmemb, size_t size) 
{ 
    size_t sz = nmemb * size; 
    void *res = malloc(sz); 

'SZ' no podría llegar a ser lo que usted espera que sea. Malloc asignará mucho menos de lo que se esperaba, pero la persona que llama puede terminar tratando el área devuelta lo suficientemente grande. Esto lleva a desbordamientos de pila con todas las implicaciones de seguridad que generalmente tiene.

0

La única diferencia real es la inicialización 0 con calloc().

¿Por qué calloc() funciona con tamaño de bloque y conteo de bloques mientras que malloc() no, nunca ha sido claro para mí.

+0

¿Qué significa esto? Lo que dice la respuesta ya se menciona en la pregunta Q del OP. –

+1

@Als Responde "¿En qué se diferencian estas memorias de la memoria inicializada" 0 "de calloc?" con "La única diferencia real es la inicialización 0 con' calloc() '.", reconociendo que no hay otra diferencia. – glglgl

4

sentimos, no hay diferencias (pero la memoria se pone a cero)

calloc() puede ser útil cuando se usa con las matrices, en las que tiene dos valores diferentes en la mano: el tamaño de las matrices y la dimensión de una sola célula . La memoria del área devuelta es contigua en ambos casos, y probablemente utilicen las mismas estructuras de datos para realizar un seguimiento de dicha área (pero esto depende de la implementación)

+0

Si uso calloc (4,1), ¿puedo asignar valor a los 4 bytes en una instancia? como: char * ptr = (char *) calloc (4,1); * ptr = ¿es posible y seguro hacerlo? –

+0

¿Es posible y seguro si el puntero devuelto no es nulo: se le garantiza que el área asignada es de al menos 4 bytes. Recuerde: nunca arroje el valor de retorno de calloc/malloc (en C). – Jack

+0

Plus: si desea asignar un valor al área asignada, no use calloc, que es más lento que malloc (debido a la inizialización). Use calloc solo si realmente necesita una inizialización cero – Jack

0

Ambos son exactamente iguales. Calloc quiere que especifique cuántos bloques de un tamaño dado desea asignar, porque los inicializa con 0. La estructura subyacente es exactamente la misma.

0

que se pueda imaginar calloc() por ser más o menos:

void* calloc(size_t nmemb, size_t size) 
{ 
    const size_t nbytes = nmemb * size; 
    void *p = malloc(nbytes); 
    if(p != NULL) 
    memset(p, 0, nbytes); 
    return p; 
} 

Tenga en cuenta que podría ser implementado de forma completamente diferente, pero es el equivalente funcional de los anteriores. No hay diferencia en el "diseño interno" de la memoria, obtienes un bloque contiguo.

1

he tratado de averiguar cómo funciona calloc

i encontrar a continuación código

/* We use this function occasionally since the real implementation may 
    be optimized when it can assume the memory it returns already is 
    set to NUL. */ 
void * weak_function 
calloc (size_t nmemb, size_t size) 
{ 
    /* New memory from the trivial malloc above is always already cleared. 
    (We make sure that's true in the rare occasion it might not be, 
    by clearing memory in free, below.) */ 
    size_t bytes = nmemb * size; 

#define HALF_SIZE_T (((size_t) 1) << (8 * sizeof (size_t)/2)) 
    if (__builtin_expect ((nmemb | size) >= HALF_SIZE_T, 0) 
     && size != 0 && bytes/size != nmemb) 
    return NULL; 

    return malloc (bytes); 
} 

Se puede ver que no hay gran diferencia entre calloc y malloc.

se puede brouse código de glibc en aquí

http://sourceware.org/git/?p=glibc.git;a=blob;f=elf/dl-minimal.c

0

Sí .¿Qué Calloc() hace es que asigna n bloquear cada uno de tamaño size_t size & entonces cada bloque de tamaño size_t size a cero.

Cuestiones relacionadas