Aula 22: Memória dinâmica — stack, heap e malloc
Até agora todas as nossas variáveis moravam na stack: elas são criadas automaticamente, o tamanho delas é fixado com antecedência, e elas desaparecem quando a função termina. Às vezes isso não é suficiente — por exemplo, quando você quer um vetor cujo tamanho só é conhecido em tempo de execução. É p
A stack é como uma bandeja de refeitório: você a recebe automaticamente e ela é levada embora no final da refeição sem perguntar. A heap é como um depósito de aluguel: você pede uma unidade do tamanho que quiser (malloc), recebe uma chave (o ponteiro), e a unidade é sua — até você devolver a chave (free). Se perder a chave sem devolvê-la, a unidade continua ocupada.
- stack
- Área de memória automática: variáveis locais moram aqui e desaparecem quando a função termina. O tamanho delas precisa ser fixado com antecedência.
- heap
- Área de memória da qual você pede blocos em tempo de execução. O que você pediu, você é responsável por liberar com free.
- malloc(size)
- Pede um bloco de size bytes da heap e retorna o endereço dele, ou NULL em caso de falha. Exige #include <stdlib.h>.
- free(p)
- Devolve à heap o bloco para o qual p aponta. Todo malloc precisa de um free quando você termina.
- verificação de NULL
- Logo depois do malloc, verifique if (p == NULL) — quando não há memória livre suficiente, malloc retorna NULL e o ponteiro não pode ser usado.