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.

  1. Crie o arquivo portais_memoria.c na pasta src/:
#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

  1. Abra o terminal integrado.
  2. Compile: gcc portais_memoria.c -o portais_memoria
  3. Execute: ./portais_memoria
  4. Digite 3 e 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)


Capitulo Anterior | Proximo Capitulo