# 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.
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. 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

As funções de alocação de memória dinâmica em C são definidas no header stdlib.h (header cstdlib em C++).
| 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

* 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
### malloc

A função malloc possui o seguinte protótipo:
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.

### calloc

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 é:

## Problemas

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.