Verificando Falhas de Alocação
Parte da seção Lógica e Fluxo do Journey de C da Coddy. Lição 34 de 63.
Embora malloc() seja uma ferramenta poderosa para alocação dinâmica de memória, há uma realidade crítica que você precisa entender: malloc() pode falhar. Quando o sistema fica sem memória disponível, malloc() não consegue atender à sua solicitação e retorna NULL em vez de um endereço de memória válido.
Isso significa que, sempre que você usar malloc(), deverá verificar se ele foi bem-sucedido antes de tentar usar o ponteiro retornado. Usar um ponteiro NULL fará com que seu programa trave com uma falha de segmentação.
int *ptr = (int*)malloc(sizeof(int));
if (ptr == NULL) {
printf("Memory allocation failed!\n");
return -1; // Saia do programa ou trate o erro
}
// Seguro usar ptr aqui
*ptr = 42;Essa verificação de NULL não é opcional — é essencial para escrever programas C robustos. Mesmo que falhas na alocação de memória sejam raras em sistemas modernos, elas podem acontecer, especialmente em ambientes com recursos limitados ou ao solicitar grandes quantidades de memória. O código C profissional sempre inclui essas verificações para evitar falhas e proporcionar um tratamento de erros adequado.
Desafio
FácilEscreva um programa em C que demonstre o tratamento adequado de error ao usar malloc() para allocation dinâmica de Memory. Seu programa deve:
- Ler um
integerndo usuário representando onumberdeintegersa serem armazenados - Usar
malloc()comsizeof()para alocar dinamicamentememorypara umarraydenintegers - Verificar se a
Memoryallocationfoisuccessful, testando se o ponteiro retornado éNULL - Se a
allocationfalhar, imprimirMemory allocation failed!e encerrar oprogram - Se a
allocationfor bem-sucedida, imprimirMemory allocation successful! - Ler
nvaloresintegerdo usuário e armazená-los noarrayalocado - Calcular e imprimir a soma de todos os valores no formato:
Sum: [value] - Imprimir o total de
bytesalocados no formato:Bytes allocated: [value]
Lembre-se de incluir o cabeçalho <stdlib.h> para usar malloc(). Seu programa deve demonstrar a prática essencial de verificar se houve failure de allocation antes de tentar usar a Memory alocada.
Por exemplo, se a entrada for:
4
10 20 30 40A saída deve ser:
Memory allocation successful!
Sum: 100
Bytes allocated: 16Este desafio enfatiza a importância crítica da programação defensiva ao trabalhar com Memory allocation dinâmica, garantindo que seus programas lidem adequadamente com possíveis Memory allocation failures, em vez de falharem inesperadamente.
Experimente você mesmo
#include <stdio.h>
#include <stdlib.h>
int main() {
// Leia o número de inteiros
int n;
scanf("%d", &n);
// TODO: Escreva seu código aqui
// - Use malloc() para alocar memória para n inteiros
// - Verifique se a alocação foi bem-sucedida
// - Trate tanto os casos de sucesso quanto de falha
// - Leia os inteiros e armazene-os
// - Calculate the sum and bytes allocated
return 0;
}Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Lógica e Fluxo
1Fundamentos de Ponteiros
O que é um Ponteiro?Declarando PonteirosO Operador de Endereço (&)O Operador de Desreferência (*)Ponteiros NULLRecapitulação: Fundamentos de Ponteiros4Projeto: Utilitário de Texto Simples
Visão Geral do ProjetoContando Caracteres2Ponteiros e Arrays
Nomes de Arrays como PonteirosElementos de Array - PonteirosAritmética de PonteirosComparando PonteirosRecapitulação: Percorrendo Arrays com Ponteiros5Ponteiros e Funções
Passagem por ValorPassando Ponteiros para FunçõesModificando Variáveis via PonteirosUm Exemplo Clássico: SwapPassando Arrays para FunçõesRecapitulação: Ponteiros como Argumentos3Arrays de Caracteres e Strings
Strings como Arrays de charO Terminador NuloEntrada de Strings com scanfUsando strlen()Usando strcpy()Usando strcat()Usando strcmp()Recapitulação: Funções Básicas de Strings6Gerenciamento de Memória
Memória Stack vs. HeapAlocação Dinâmica - malloc()Usando sizeof() para AlocaçãoVerificando Falhas de AlocaçãoLiberando Memória com free()Alocando com calloc()Recapitulação: Array Dinâmico9Projeto: Cadastro Simples de Contatos
Projeto: Definir a Struct de ContatoFunção para Criar um ContatoPratique por conta própria: Compilador de C online