calloc vs. malloc

Quando calloc é usado para alocar um bloco de memória, a região alocada é inicializada em zeros. Em contraste, malloc não toca no conteúdo do bloco de memória alocado, o que significa que ele contém valores de lixo. Isso pode ser um risco à segurança, pois o conteúdo da memória é imprevisível e os erros de programação podem resultar em um vazamento desse conteúdo..

Gráfico de comparação

Diferenças - Semelhanças - gráfico de comparação calloc versus malloc
callocmalloc
Função aloca uma região de memória grande o suficiente para armazenar "n elementos" de bytes "de tamanho" cada. Também inicializa o conteúdo da memória para zerar. aloca bytes de "tamanho" de memória.
Número de argumentos 2 1
Sintaxe vooc * calloc (número_de_blocos, tamanho_de_processo_de_bloco_de_bytes); void * malloc (size_in_bytes);
Conteúdo da memória alocada A região alocada é inicializada em zero. O conteúdo da memória alocada não é alterado. ou seja, a memória contém valores imprevisíveis ou de lixo. Isso representa um risco.
Valor de retorno ponteiro nulo (nulo *). Se a alocação for bem-sucedida, um ponteiro para o bloco de memória será retornado. Se a alocação de memória falhar, um ponteiro NULL será retornado. ponteiro nulo (nulo *). Se a alocação for bem-sucedida, um ponteiro para o bloco de memória será retornado. Se a alocação de memória falhar, um ponteiro NULL será retornado.

Conteúdo: calloc vs. malloc

  • 1 Sintaxe e Exemplos
    • 1.1 malloc ()
    • 1.2 calloc ()
  • 2 Vídeo explicando Calloc, Malloc e Realloc
  • 3 Considerações de segurança
  • 4 Velocidade de execução
  • 5 Referências

Sintaxe e Exemplos

malloc ()

void * malloc (tamanho_t tamanho); 

aloca Tamanho bytes de memória. Se a alocação for bem-sucedida, um ponteiro para a memória alocada será retornado. De outra forma NULO é retornado. Exemplo:

/ * Alocar memória para uma matriz com 15 elementos do tipo int. * / int * ptr = malloc (15 * sizeof (int)); se (ptr == NULL) / * Não foi possível alocar memória, imprima um erro e saia. * / fprintf (stderr, "Não foi possível alocar memória \ n"); sair (EXIT_FAILURE);  / * Alocação bem-sucedida. * / 

Observe que malloc requer que calculemos os bytes de memória que precisamos e passamos isso como argumento para o malloc.

calloc ()

void * calloc (tamanho_t elementos, tamanho_t bytes); 

aloca um bloco contíguo de memória grande o suficiente para armazenar elementos de tamanho bytes cada. A região alocada é inicializada em zero. No exemplo acima:

/ * Aloque espaço para uma matriz com 15 elementos do tipo int e inicialize com zeros. * / int * ptr = calloc (15, tamanho de (int)); se (ptr == NULL) / * Não foi possível alocar memória, imprima um erro e saia. * / fprintf (stderr, "Não foi possível alocar memória \ n"); sair (EXIT_FAILURE);  / * Alocação bem-sucedida. * / 

calloc (m, n) é o mesmo que

p = malloc (m * n); se (p) memset (p, 0, m * n); 

Vídeo Explicando Calloc, Malloc e Realloc

Este tutorial em vídeo explica as funções de alocação de memória malloc, calloc e realloc, bem como a função de desalocação de memória livre:

Considerações de segurança

Geralmente é uma boa ideia usar calloc sobre malloc. Quando você usa malloc, o conteúdo da memória alocada é imprevisível. Erros de programação podem fazer com que esse conteúdo de memória vaze de maneiras não intencionais, mas altamente vulneráveis. Um bom exemplo desse vazamento é a vulnerabilidade Heartbleed no OpenSSL, cujo mecanismo básico é explicado nesta história em quadrinhos do XKCD e há mais detalhes técnicos nesta publicação do blog..

Velocidade de execução

O calloc é um pouco mais lento que o malloc devido à etapa extra de inicializar a região de memória alocada. No entanto, na prática, a diferença de velocidade é muito pequena e pode ser ignorada.

Referências

  • calloc página de manual
  • malloc página de manual