Spec Sistemas Com C • Trilha Progressiva em 4 Níveis


🎯 Nível 1: Fundamentos

Problema 15.1 — Alocação com malloc(), Verificação de NULL e Liberação com free()

Contexto: Alocação com malloc(), Verificação de NULL e Liberação com free() no contexto de Alocação Dinâmica no Heap, Valgrind e Prevenção de Leaks.

Requisitos de Execução:

  1. Alocar dinamicamente vetor de N inteiros, verificar se o retorno não foi NULL e liberar com free().

Resultado Esperado

Memória alocada no Heap e liberada sem vazamentos.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_15_1_SeuNome
  2. Envie na tarefa: Atividade Cap 15 - Alocação Dinâmica no Heap, Valgrind e Prevenção de Leaks
🔑 Gabarito de Código & Solução Comentada
#include <stdio.h>
#include <stdlib.h>

int main(void) {
    int n = 5;
    int *arr = (int *)malloc(n * sizeof(int));
    if (arr == NULL) {
        fputs("Erro: memoria insuficiente.\n", stderr);
        return 1;
    }
    for (int i = 0; i < n; i++) arr[i] = (i + 1) * 10;
    printf("Elemento alocado [4]: %d\n", arr[4]);
    free(arr);
    arr = NULL;
    return 0;
}

🔍 Nível 2: Prática

Problema 15.2 — Alocação Zerada com calloc() e Redimensionamento com realloc()

Contexto: Alocação Zerada com calloc() e Redimensionamento com realloc() no contexto de Alocação Dinâmica no Heap, Valgrind e Prevenção de Leaks.

Requisitos de Execução:

  1. Alocar buffer zerado com calloc e expandir dinamicamente a capacidade com realloc.

Resultado Esperado

Capacidade do array dinâmico expandida preservando dados existentes.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_15_2_SeuNome
  2. Envie na tarefa: Atividade Cap 15 - Alocação Dinâmica no Heap, Valgrind e Prevenção de Leaks
🔑 Gabarito de Código & Solução Comentada
#include <stdio.h>
#include <stdlib.h>

int main(void) {
    int *v = (int *)calloc(3, sizeof(int));
    v[0] = 10; v[1] = 20; v[2] = 30;

    int *temp = (int *)realloc(v, 6 * sizeof(int));
    if (temp != NULL) {
        v = temp;
        v[3] = 40;
        printf("Array expandido: v[3]=%d\n", v[3]);
    }
    free(v);
    return 0;
}

⚡ Nível 3: Integração

Problema 15.3 — Alocação de Matrizes Dinâmicas 2D com Ponteiro Duplo

Contexto: Alocação de Matrizes Dinâmicas 2D com Ponteiro Duplo no contexto de Alocação Dinâmica no Heap, Valgrind e Prevenção de Leaks.

Requisitos de Execução:

  1. Alocar matriz dinamicamente alocando vetor de ponteiros para linhas e liberar linha por linha.

Resultado Esperado

Matriz 2D alocada dinamicamente no heap e liberada corretamente.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_15_3_SeuNome
  2. Envie na tarefa: Atividade Cap 15 - Alocação Dinâmica no Heap, Valgrind e Prevenção de Leaks
🔑 Gabarito de Código & Solução Comentada
#include <stdio.h>
#include <stdlib.h>

int main(void) {
    int linhas = 3, colunas = 4;
    int **mat = (int **)malloc(linhas * sizeof(int *));
    for (int i = 0; i < linhas; i++) {
        mat[i] = (int *)malloc(colunas * sizeof(int));
    }
    mat[1][2] = 99;
    printf("Valor dinâmico [1][2]: %d\n", mat[1][2]);

    for (int i = 0; i < linhas; i++) free(mat[i]);
    free(mat);
    return 0;
}

🏆 Nível 4: Desafio Corporativo

Problema 15.4 — Prevenção de Dangling Pointers e Auditoria com Valgrind

Contexto: Prevenção de Dangling Pointers e Auditoria com Valgrind no contexto de Alocação Dinâmica no Heap, Valgrind e Prevenção de Leaks.

Requisitos de Execução:

  1. Implementar macro de liberação segura SAFE_FREE(ptr) que atribua NULL imediatamente após o free.

Resultado Esperado

Dangling pointer prevenido: 0 erros detectados pelo Valgrind.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_15_4_SeuNome
  2. Envie na tarefa: Atividade Cap 15 - Alocação Dinâmica no Heap, Valgrind e Prevenção de Leaks
🔑 Gabarito de Código & Solução Comentada
#include <stdio.h>
#include <stdlib.h>

#define SAFE_FREE(p) do { free(p); (p) = NULL; } while(0)

int main(void) {
    char *buffer = (char *)malloc(128);
    SAFE_FREE(buffer);
    if (buffer == NULL) {
        puts("Ponteiro seguro: NULL atribuido apos liberacao.");
    }
    return 0;
}