Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Industrial programming >> Linguagem C

malloc vs calloc: Diferenças-Chave Explicadas com Exemplos Práticos

O que é Alocação Dinâmica de Memória?

A alocação dinâmica de memória permite que um programa solicite e libere memória em tempo de execução. Em C, a biblioteca padrão fornece quatro funções principais para esse propósito – malloc(), calloc(), realloc() e free() – todas declaradas em stdlib.h.

malloc(): Alocar um Único Bloco de Memória

malloc() (abreviação de "memory allocation") reserva um bloco contíguo de bytes e retorna um ponteiro para o primeiro byte. O conteúdo do bloco recém-alocado é indeterminado, ou seja, contém quaisquer bits que aconteciam de estar naquela localização na memória.

Uso típico:

int *p = (int *)malloc(n * sizeof(int));
Se a solicitação falhar, malloc() retorna NULL.

calloc(): Alocar Múltiplos Blocos Inicializados com Zero

calloc() (abreviação de "contiguous allocation") recebe dois argumentos: o número de elementos e o tamanho de cada elemento. Ele aloca memória para todos os elementos e define automaticamente cada byte como zero, tornando-o ideal para arrays ou estruturas que precisam de um estado inicial limpo.

Uso típico:

int *p = (int *)calloc(n, sizeof(int));
Como malloc(), retorna NULL se a alocação falhar.

Quando Usar Cada Função

Visão Geral da Sintaxe

malloc()

void *malloc(size_t size);

calloc()

void *calloc(size_t num, size_t size);

Exemplos Práticos de Código

Exemplo 1: Usando malloc() para Armazenar 15 Inteiros

#include <stdlib.h>
#include <stdio.h>
int main(void) {
    int *ptr = malloc(15 * sizeof(*ptr));
    if (!ptr) {
        perror("malloc falhou");
        return EXIT_FAILURE;
    }
    ptr[5] = 480; // 6º elemento (índice base 0)
    printf("Valor do 6º inteiro é %d\n", ptr[5]);
    free(ptr);
    return EXIT_SUCCESS;
}

Saída: Valor do 6º inteiro é 480

Exemplo 2: Usando calloc() para Calcular uma Soma

#include <stdlib.h>
#include <stdio.h>
int main(void) {
    int *ptr = calloc(10, sizeof(int));
    if (!ptr) {
        perror("calloc falhou");
        return EXIT_FAILURE;
    }
    int sum = 0;
    for (int i = 0; i < 10; ++i) {
        ptr[i] = i; // inicialização redundante, mas mostrada para clareza
        sum += ptr[i];
    }
    printf("Soma = %d\n", sum);
    free(ptr);
    return EXIT_SUCCESS;
}

Saída: Soma = 45

Comparação Lado a Lado

Característicamalloc()calloc()
Número de parâmetros1 (tamanho)2 (quantidade, tamanho)
Estado da memória após alocaçãoNão inicializada (lixo)Inicializada com zero
Caso de uso típicoBloco único, inicialização manualArrays ou estruturas precisando de início limpo
DesempenhoMais rápido (sem zerar)Mais lento (overhead de zerar)
SegurançaMaior risco de usar valores lixoMenor risco devido à zeragem automática
Valor de retorno em falhaNULLNULL
Header padrãostdlib.hstdlib.h

Conclusão

Linguagem C

  1. Expressões, Instruções e Blocos em C#: Guia Completo com Exemplos Práticos
  2. Laço do-while em C++: Sintaxe, Exemplos Práticos e Loops Aninhados
  3. Dominando Ponteiros em C++: Conceitos, Exemplos e Aplicações Práticas
  4. Dominando o Tipo Char em C++: Declaração, ASCII e Técnicas de Conversão
  5. Sobrecarga de Operadores em C++: Guia Prático com Exemplos de Código
  6. Funções em C++ Explicadas com Exemplos Práticos de Código
  7. Dominando Collections em C#: Tutorial Prático com Exemplos do Mundo Real
  8. While vs. Do-While: Comparação Clara com Exemplos Práticos
  9. calloc() em C: Alocação de Memória Inicializada com Zero e Exemplo Prático
  10. Domine o str.count() do Python: Como Contar Caracteres e Substrings com Exemplos