Capítulo 11: Alocação Dinâmica de Memória 🌀🔬
Neste capítulo, vamos aprender a reservar espaço na memória do computador em tempo de execução usando a Alocação Dinâmica, com o tema Portal!
📖 O que é Alocação Dinâmica?
Até agora, quando criávamos um vetor (ex: int poderes[4]), o tamanho era fixo e decidido antes do programa rodar. Com a alocação dinâmica, podemos perguntar ao usuário quantos itens ele quer e criar um vetor exatamente desse tamanho enquanto o programa está rodando!
Usamos as funções malloc (para alocar) e free (para liberar) da biblioteca stdlib.h.
📖 Exemplo Guiado: Criando Portais de Memória
Vamos criar um vetor cujo tamanho é decidido pelo usuário.
- Crie o arquivo
portais_memoria.cna pastasrc/:
#include <stdio.h>
#include <stdlib.h> // Necessária para malloc e free
int main() {
int tamanho;
int *vetor;
printf("Quantos portais de memoria voce deseja criar? ");
scanf("%d", &tamanho);
// Alocando memória dinamicamente
// malloc reserva (tamanho * tamanho de um inteiro) bytes
vetor = (int *) malloc(tamanho * sizeof(int));
if (vetor == NULL) {
printf("Erro: Não há memória suficiente na Aperture Science!\n");
return 1; // Encerra o programa com erro
}
// Preenchendo o vetor
for (int i = 0; i < tamanho; i++) {
vetor[i] = (i + 1) * 10;
}
// Exibindo os valores
printf("\nValores nos portais:\n");
for (int i = 0; i < tamanho; i++) {
printf("Portal %d: %d\n", i + 1, vetor[i]);
}
// REGRA DE OURO: Sempre libere a memória alocada!
free(vetor);
printf("\nMemoria liberada com sucesso!\n");
return 0;
}🕹️ Como Executar e Testar no VS Code
- Abra o terminal integrado.
- Compile:
gcc portais_memoria.c -o portais_memoria - Execute:
./portais_memoria - Digite
3e pressione Enter.
Resultado Esperado:
Quantos portais de memoria voce deseja criar? 3
Valores nos portais:
Portal 1: 10
Portal 2: 20
Portal 3: 30
Memoria liberada com sucesso!📊 Ilustração Visual: Alocação de Memória
Veja como o malloc reserva o espaço e o free o devolve:
graph TD A[Memória Livre] -->|1. malloc| B[Espaço Reservado para o Vetor] B -->|2. Uso do programa| B B -->|3. free| A
🛠️ Prática Obrigatória 1: Registro de Cobaias
Crie um programa chamado registro_cobaias.c que pergunte quantas cobaias o usuário deseja cadastrar. Aloque dinamicamente um vetor de inteiros para guardar os IDs das cobaias, preencha-o com IDs digitados pelo usuário e, no final, exiba-os e libere a memória!
🔑 Gabarito de Código
Prática 1: registro_cobaias.c
#include <stdio.h>
#include <stdlib.h>
int main() {
int n;
int *ids;
printf("Quantas cobaias deseja cadastrar? ");
scanf("%d", &n);
ids = (int *) malloc(n * sizeof(int));
if (ids == NULL) {
printf("Erro de alocacao!\n");
return 1;
}
for (int i = 0; i < n; i++) {
printf("Digite o ID da cobaia %d: ", i + 1);
scanf("%d", &ids[i]);
}
printf("\nCobaias Cadastradas:\n");
for (int i = 0; i < n; i++) {
printf("Cobaia %d: ID %d\n", i + 1, ids[i]);
}
free(ids);
return 0;
}📤 Instruções de Entrega (GitHub Desktop + Microsoft Teams)
(Siga o padrão estabelecido no Guia)