English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Tutorial Básico de Linguagem C

Controle de Fluxo de Linguagem C

Função C

Array C

Ponteiro C

String C

Estruturas de Linguagem C

Arquivos de Linguagem C

Outros C

Manual de Referência do Linguagem C

Alocação Dinâmica de Memória C

Neste tutorial, você aprenderá a usar as funções da biblioteca padrão: malloc(), calloc(), free() e realloc() para alocar memória dinamicamente em programas C.

Como você já sabe, um array é um conjunto fixo de valores. Após declarar o tamanho do array, você não pode mudá-lo.

Às vezes, o tamanho do array que você declarou pode ser insuficiente. Para resolver esse problema, você pode alocar memória manualmente durante a execução. Isso é chamado de alocação de memória dinâmica em programação C.

Pode-se usar as funções da biblioteca padrão malloc(), calloc(), realloc() e free() para alocar memória dinamicamente. Essas funções são definidas no cabeçalho <stdlib.h>.

C malloc()

O nome “malloc” significa alocação de memória.

A função malloc() reserva um bloco de memória de bytes especificados. E ela retorna um voidPonteiropode ser convertida em qualquer tipo de ponteiro.

Sintaxe do malloc()

ptr = (castType*) malloc(size);

Exemplo

ptr = (float*) malloc(100 * sizeof(float));

A sentença acima alocou400 bytes de memória. Porque o tamanho do número flutuante é4Bytes. E o ponteiro ptr armazena o endereço do primeiro byte da memória alocada.

Se não for possível alocar memória, a expressão produzirá um ponteiro NULL.

C calloc()

O nome “calloc” significa alocação contínua.

A função malloc() aloca memória e mantém memória não inicializada. Enquanto a função calloc() aloca memória e inicializa todos os bits com zero.

Sintaxe do calloc()

ptr = (castType*)calloc(n, size);

Exemplo:

ptr = (float*)calloc(25, sizeof(float));

A instrução acima aloca espaço na memória para25elementos do tipo float em espaço contíguo.

C free()

A memória alocada dinamicamente com calloc() ou malloc() não é liberada automaticamente. É necessário usar explicitamente free() para liberar o espaço.

Sintaxe do free()

free(ptr);

A instrução libera o espaço alocado no memória apontada por ptr.

Exemplo1:malloc() e free()

//Programa para calcular a soma dos n números introduzidos pelo usuário
#include <stdio.h>
#include <stdlib.h>
int main()
{
    int n, i, *ptr, sum = 0;
    printf("Número de elementos a introduzir: ");
    scanf("%d", &n);
    ptr = (int*)malloc(n * sizeof(int));
 
    // Se não for possível alocar memória
    if(ptr == NULL)                     
    {
        printf("Erro! Memória não alocada.");
        exit(0);
    }
    printf("Introduzir elemento: ");
    for(i = 0; i < n; ++i)
    {
        scanf("%d", ptr + i);
        sum += *(ptr + i);
    }
    printf("Soma = %d", sum);
  
    //Liberar memória
    free(ptr);
    return 0;
}

Aqui, alocamos memória dinamicamente para n int.

Exemplo2:calloc() e free()

//Programa para calcular a soma dos n números introduzidos pelo usuário
#include <stdio.h>
#include <stdlib.h>
int main()
{
    int n, i, *ptr, sum = 0;
    printf("Número de elementos a introduzir: ");
    scanf("%d", &n);
    ptr = (int*)calloc(n, sizeof(int));
    if(ptr == NULL)
    {
        printf("Erro! Memória não alocada.");
        exit(0);
    }
    printf("Introduzir elemento: ");
    for(i = 0; i < n; ++i)
    {
        scanf("%d", ptr + i);
        sum += *(ptr + i);
    }
    printf("Soma = %d", sum);
    free(ptr);
    return 0;
}

C realloc()

Se a memória alocada dinamicamente não for suficiente ou exceder a necessidade, pode-se usar a função realloc() para alterar o tamanho da memória alocada anteriormente.

Sintaxe do realloc()

ptr = realloc(ptr, x);

Aqui, ptr é alocado para o novo tamanho x.

Exemplo3:realloc()

#include <stdio.h>
#include <stdlib.h>
int main()
{
    int *ptr, i, n1, n2;
    printf("Tamanho a ser introduzido: ");
    scanf("%d", &n1);
    ptr = (int*)malloc(n1 * sizeof(int));
    printf("Endereço de memória alocado anteriormente: ");
    for (i = 0; i < n1; ++i)
        printf("睵n", ptr + i);
    printf("\nTamanho novo a ser alocado: ");
    scanf("%d", &n2);
    //Alocar memória novamente
    ptr = realloc(ptr, n2 * sizeof(int));
    printf("Nova endereço de memória alocada: ");
    for (i = 0; i < n2; ++i)
        printf("睵n", ptr + i);
    free(ptr);
    return 0;
}

A saída do programa ao executar é:

Insira o tamanho: 3
Endereço de memória alocado anteriormente: 7452312
7452316
7452320
Insira o novo tamanho: 5
Endereço de memória recém-alocado: 7452312
7452316
7452320
7452324
7452328