Da trilha de C Este conceito ainda não saiu como card do dia. ir para o card de hoje

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) aloca n bytes e retorna void*; a memória não é inicializada.
  • calloc(n, size) aloca n * size bytes e inicializa tudo com zero.
  • realloc(ptr, novo_tamanho) redimensiona o bloco, podendo mover os dados.
  • Sempre libere a memória com free quando não precisar mais dela.
  • Verifique se a alocação retornou NULL antes de usar o ponteiro.
alocacao_dinamica.c
#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;
}

Exercícios

  1. 1
    Fácil

    Alocação com calloc e exibição

    Escreva um programa que aloque dinamicamente um vetor de 10 inteiros usando calloc, preencha-o com os números de 1 a 10 e depois exiba todos os elementos. Libere a memória ao final.

    Resolver
  2. 2
    Médio

    Redimensionamento com realloc

    Crie um programa que leia um número inteiro n do usuário, aloque dinamicamente um vetor de n inteiros, preencha-o com valores de 0 a n-1 e depois redimensione-o para 2*n elementos usando realloc. Preencha os novos elementos com valores de n a 2*n-1 e exiba todo o vetor. Libere a memória ao final.

    Resolver
  3. 3
    Desafio

    Vetor dinâmico sem vazamentos

    Implemente um programa que leia uma sequência de números inteiros positivos do usuário (terminada por 0) e armazene-os em um vetor dinâmico que cresce conforme a necessidade. A cada leitura, se o vetor estiver cheio, dobre sua capacidade usando realloc. Ao final, exiba todos os números na ordem em que foram digitados e libere toda a memória. Certifique-se de que não haja vazamentos.

    Resolver

Continue estudando