Verificando Falhas de Alocação
Parte da seção Logic & Flow do Journey de C da Coddy — lição 34 de 63.
Embora o malloc() seja uma ferramenta poderosa para alocação dinâmica de memória, existe uma realidade crítica que você deve entender: malloc() pode falhar. Quando o sistema fica sem memória disponível, o malloc() não consegue atender ao seu pedido e retorna NULL em vez de um endereço de memória válido.
Isso significa que toda vez que você usar malloc(), você deve verificar se ela foi bem-sucedida 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; // Encerra o programa ou trata o erro
}
// Seguro para usar ptr aqui
*ptr = 42;Esta verificação de NULL não é opcional - é essencial para escrever programas em C robustos. Mesmo que falhas de 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 fornecer um tratamento de erros adequado.
Desafio
FácilEscreva um programa em C que demonstre o tratamento de erros adequado ao usar malloc() para alocação dinâmica de memória. Seu programa deve:
- Ler um número inteiro
ndo usuário representando a quantidade de inteiros a serem armazenados - Usar
malloc()comsizeof()para alocar memória dinamicamente para um array deninteiros - Verificar se a alocação de memória foi bem-sucedida testando se o ponteiro retornado é
NULL - Se a alocação falhar, imprimir
Memory allocation failed!e encerrar o programa - Se a alocação for bem-sucedida, imprimir
Memory allocation successful! - Ler
nvalores inteiros do usuário e armazená-los no array alocado - Calcular e imprimir a soma de todos os valores no formato:
Sum: [value] - Imprimir o total de bytes alocados 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 falhas de alocação antes de tentar usar a memória alocada.
Por exemplo, se a entrada for:
4
10 20 30 40Sua 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 alocação dinâmica de memória, garantindo que seus programas lidem com possíveis falhas de alocação de memória de forma graciosa, em vez de travar inesperadamente.
Folha de consulta
Sempre verifique se malloc() retorna NULL antes de usar a memória alocada:
int *ptr = (int*)malloc(sizeof(int));
if (ptr == NULL) {
printf("Memory allocation failed!\n");
return -1; // Encerra o programa ou trata o erro
}
// Seguro para usar ptr aqui
*ptr = 42;malloc() pode falhar quando o sistema fica sem memória disponível. Usar um ponteiro NULL causará uma falha de segmentação (segmentation fault). Esta verificação de NULL é essencial para escrever programas em C robustos e evitar falhas (crashes).
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
// - Lide com os casos de sucesso e falha
// - Leia os inteiros e armazene-os
// - Calcule a soma e os bytes alocados
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 Logic & Flow
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 Contato