✅ O que é Alocação Dinâmica?

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.


🧩 Funções Básicas de Alocaçã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.

📌 Exemplo com malloc

Exemplo:

#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;
}


🪄 Exemplo com calloc

Exemplo:

#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;
}

🔄 Redimensionando com realloc

Exemplo:

#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;
}