Menu
Coddy logo textTech

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.

challenge icon

Desafio

Fácil

Escreva 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:

  1. Ler um número inteiro n do usuário representando a quantidade de inteiros a serem armazenados
  2. Usar malloc() com sizeof() para alocar memória dinamicamente para um array de n inteiros
  3. Verificar se a alocação de memória foi bem-sucedida testando se o ponteiro retornado é NULL
  4. Se a alocação falhar, imprimir Memory allocation failed! e encerrar o programa
  5. Se a alocação for bem-sucedida, imprimir Memory allocation successful!
  6. Ler n valores inteiros do usuário e armazená-los no array alocado
  7. Calcular e imprimir a soma de todos os valores no formato: Sum: [value]
  8. 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 40

Sua saída deve ser:

Memory allocation successful!
Sum: 100
Bytes allocated: 16

Este 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;
}
quiz iconTeste seus conhecimentos

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