🧩 Exercícios: Alocação Dinâmica no Heap, Valgrind e Prevenção de Leaks
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:
- 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)
- Salve o arquivo como:
Atividade_15_1_SeuNome - 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:
- Alocar buffer zerado com
calloce expandir dinamicamente a capacidade comrealloc.
Resultado Esperado
Capacidade do array dinâmico expandida preservando dados existentes.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_15_2_SeuNome - 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:
- 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)
- Salve o arquivo como:
Atividade_15_3_SeuNome - 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:
- 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)
- Salve o arquivo como:
Atividade_15_4_SeuNome - 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;
}