Alocação dinâmica de memória em C

Alocação dinâmica de memória em C se refere à execução de gerenciamento manual de memória para alocação dinâmica de memória na linguagem de programação C por meio de um grupo de funções na biblioteca padrão do C, que são malloc, realloc, calloc e freefree.[1][2][3]

A linguagem de programação C++ inclui essas funções; no entanto, os operadores new e delete fornecem funcionalidade semelhante e são recomendados pelos autores desse idioma.[4] Ainda assim, existem várias situações em que o uso de new/delete não é aplicável, como código de coleta de lixo (garbage collection) ou código sensível ao desempenho, e uma combinação de malloc e placement new pode ser necessária em vez do operador new de alto nível. malloc é um termo da computação que designa uma função da biblioteca padrão das linguagens de programação C e C++ para requisitar alocação dinâmica de memória. É uma forma abreviada de escrever memory allocation (alocação de memória).

Funções editar

As funções de alocação de memória dinâmica em C são definidas no header stdlib.h (header cstdlib em C++).[1]

Função Descrição
malloc aloca o número especificado de bytes
realloc aumenta ou diminui o tamanho do bloco de memória especificado, movendo-o se necessário
calloc aloca o número especificado de bytes e os inicializa para zero
free libera o bloco especificado de memória de volta para o sistema

Diferenças entre malloc() e calloc() editar

  • malloc() leva um único argumento (a quantidade de memória a ser alocada em bytes), enquanto calloc() precisa de dois argumentos (o número de variáveis ​​a serem alocadas na memória e o tamanho em bytes de uma única variável).
  • malloc() não inicializa a memória alocada, enquanto calloc() garante que todos os bytes do bloco de memória alocado foram inicializados para 0.
  • Em alguns sistemas operacionais, calloc() pode ser implementado apontando inicialmente todas as páginas dos endereços virtuais da memória alocada para uma página somente leitura somente com 0s, e apenas alocando páginas físicas de leitura e escrita quando os endereços virtuais são escritos, um método denominado cópia em gravação.

Uso editar

malloc editar

A função malloc possui o seguinte protótipo:

void *malloc(size_t size);

Recebendo como parâmetro o tamanho em bytes da região a ser alocada e retornando um ponteiro para a área alocada. Se ocorrer um erro ao alocar memória, retorna um ponteiro para NULL.

O exemplo de código na linguagem C a seguir pede a alocação dinâmica de um vector de inteiros com vinte e cinco posições, altera o valor na posição dez e depois libera a área de memória.

int *vector = NULL; /* declaração do ponteiro */
vector = (int*) malloc(25 * sizeof(int)); /* alocação de memória para o vector */
vector[10] = 34; /* altera o valor da posição dez para trinta e quatro */
free(vector); /* liberta a área de memória alocada */

calloc editar

calloc é uma função da biblioteca stdlib.h, da linguagem de programação C. Seu objetivo é criar um vetor de tamanho dinâmico, ou seja, definido durante a execução do programa. Difere da função malloc, também de C, pois além de inicializar os espaços de memória ainda atribui o valor 0 (zero) para cada um deles. É útil, pois em C quando se declara um variável o espaço no mapa de memória usado por esta provavelmente contém algum valor lixo.

Sua sintaxe é:

void *calloc(tipo n_elementos, tipo elementoTamanho);


Problemas editar

O uso de memória dinâmica administrada pelo próprio programador abre a possibilidade para a ocorrência de problemas relativos ao mau uso da memória que muitas vezes geram vulnerabilidades de segurança e erros de difícil localização. Entre os problemas mais comuns estão:

  • Vazamento de memória: ter uma região de memória alocada porém sem ponteiros para ela o que impede sua libertação
  • Buffer overflow: escrever na memória para além do limite da área alocada
  • Uso de áreas liberadas: escrever numa região da memória que já foi libertada por free
  • Falha do malloc: se não houver memória disponível, o malloc irá falhar

Há ferramentas especializadas para detectar problemas desta natureza como o Valgrind.

Referências

  1. a b ISO/IEC 9899:1999 specification (PDF). [S.l.: s.n.] p. 313, § 7.20.3 "Memory management functions" 
  2. Godse, Atul P.; Godse, Deepali A. (2008). Advanced C Programming. p. 6-28: Technical Publications. 400 páginas. ISBN 978-81-8431-496-0 
  3. Summit, Steve. «Chapter 11: Memory Allocation». C Programming Notes. Consultado em 11 de julho de 2020 
  4. Stroustrup, Bjarne (2008). Programming: Principles and Practice Using C++. 1009, §27.4 Free store: Addison Wesley. 1236 páginas. ISBN 978-0-321-54372-1 
  Este artigo sobre software é um esboço. Você pode ajudar a Wikipédia expandindo-o.