C Memória Intermediário
Alocação dinâmica
Em C, a memória pode ser alocada de duas formas: estaticamente (em tempo de compilação) ou dinamicamente (em tempo de execução). A alocação dinâmica permite criar estruturas de dados cujo tamanho só é conhecido durante a execução, como vetores que crescem conforme a necessidade. As funções principais são malloc, calloc, realloc e free, todas declaradas em <stdlib.h>.
malloc aloca um bloco de memória não inicializado; calloc aloca e inicializa com zeros; realloc redimensiona um bloco já alocado; e free libera a memória. É fundamental liberar toda memória alocada para evitar vazamentos (memory leaks), que podem esgotar os recursos do sistema.
Neste card, você aprenderá a usar essas funções corretamente, incluindo verificações de erro e boas práticas para gerenciar memória dinâmica em C.
Pontos-chave
malloc(n)alocanbytes e retornavoid*; a memória não é inicializada.calloc(n, size)alocan * sizebytes e inicializa tudo com zero.realloc(ptr, novo_tamanho)redimensiona o bloco, podendo mover os dados.- Sempre libere a memória com
freequando não precisar mais dela. - Verifique se a alocação retornou
NULLantes de usar o ponteiro.
#include <stdio.h>
#include <stdlib.h>
int main(void) {
// Aloca um vetor de 5 inteiros com malloc (não inicializado)
int *vetor = malloc(5 * sizeof(int));
if (vetor == NULL) {
printf("Erro: malloc falhou\n");
return 1;
}
// Preenche o vetor
for (int i = 0; i < 5; i++) {
vetor[i] = (i + 1) * 10;
}
// Exibe os valores
printf("Vetor original: ");
for (int i = 0; i < 5; i++) {
printf("%d ", vetor[i]);
}
printf("\n");
// Redimensiona para 8 elementos com realloc
int *novo_vetor = realloc(vetor, 8 * sizeof(int));
if (novo_vetor == NULL) {
printf("Erro: realloc falhou\n");
free(vetor); // libera o bloco original
return 1;
}
vetor = novo_vetor;
// Preenche os novos elementos
for (int i = 5; i < 8; i++) {
vetor[i] = (i + 1) * 10;
}
printf("Vetor expandido: ");
for (int i = 0; i < 8; i++) {
printf("%d ", vetor[i]);
}
printf("\n");
// Libera a memória
free(vetor);
return 0;
}