Até agora, toda vez que usamos int x; ou char nome[50];, a memória era alocada de forma estática (tamanho fixo, definido em tempo de compilação).
Alocação Dinâmica é quando pedimos memória ao sistema operacional durante a execução do programa, usando funções da biblioteca <stdlib.h>.
Isso nos dá flexibilidade para criar vetores, matrizes e estruturas cujo tamanho só sabemos em tempo de execução.
Disponíveis em <stdlib.h>:
| Função | O que faz |
|---|---|
malloc |
Aloca um bloco de memória de tamanho fixo. Conteúdo indefinido. |
calloc |
Aloca e inicializa a memória com zeros. |
realloc |
Redimensiona um bloco já alocado. |
free |
Libera a memória alocada. |
mallocExemplo:
#include <stdio.h>
#include <stdlib.h>
int main() {
int *vetor;
int n;
printf("Digite o tamanho do vetor: ");
scanf("%d", &n);
// alocação dinâmica
vetor = (int *) malloc(n * sizeof(int));
if (vetor == NULL) {
printf("Erro: Memória insuficiente!\n");
return 1;
}
// preenchendo o vetor
for (int i = 0; i < n; i++) {
vetor[i] = i * 10;
}
// exibindo o vetor
for (int i = 0; i < n; i++) {
printf("%d ", vetor[i]);
}
// liberando memória
free(vetor);
return 0;
}
callocExemplo:
#include <stdio.h>
#include <stdlib.h>
int main() {
int *vetor;
int n = 5;
vetor = (int *) calloc(n, sizeof(int));
if (vetor == NULL) {
printf("Erro ao alocar memória!\n");
return 1;
}
printf("Elementos inicializados:\n");
for (int i = 0; i < n; i++) {
printf("%d ", vetor[i]); // tudo começa em 0
}
free(vetor);
return 0;
}
reallocExemplo:
#include <stdio.h>
#include <stdlib.h>
int main() {
int *vetor;
int n = 3;
vetor = (int *) malloc(n * sizeof(int));
for (int i = 0; i < n; i++) vetor[i] = i + 1;
// aumenta para 5 posições
vetor = (int *) realloc(vetor, 5 * sizeof(int));
vetor[3] = 4;
vetor[4] = 5;
for (int i = 0; i < 5; i++) {
printf("%d ", vetor[i]);
}
free(vetor);
return 0;
}