aula 200

Como aumentar o tamanho de um vetor com a função realloc?

Nesta aula vamos aprender como aumentar o tamanho de um vetor com a função realloc na linguagem de programação C.

Ao aprender a estrutura de dados vetor é comum a seguinte pergunta: como alterar o tamanho de um vetor?

Um vetor (array unidimensional) é uma estrutura estática, ou seja, não cresce nem diminuiu de tamanho. Assim, se criamos um vetor com tamanho 10 e chegamos a conclusão que precisamos de um vetor maior, precisamos criar outro vetor maior.

Ao trabalhar com alocação dinâmica de memória na linguagem de programação C isso é facilitado com a função realloc. O objetivo desta função é justamente alocar uma quantidade de memória maior do que a que já existe para um determinado conjunto de dados. Vamos a um exemplo.

Imagine um vetor com tamanho 100 e, durante a execução do programa, todo o vetor foi preenchido. Um novo valor pode ser pedido ao usuário, por exemplo 200, e então utilizar a função realloc para fazer uma realocação de memória para o vetor original de tamanho 100.

Como utilizar a função realloc?

A utilização da função realloc é bem simples. Ela recebe dois parâmetros, o vetor original e o novo tamanho que desejamos. Seu retorno é o endereço inicial da região de memória alocada.

        // vet - vetor cujo tamanho desejamos aumentar
        // tam - tamanho do novo vetor
        vet = realloc(vet, tam);

A função realloc realmente aumenta o tamanho de um vetor?

Não. Como já foi dito um vetor é uma estrutura estática e seu tamanho, uma vez definido, é imutável.

O que a função realloc faz na verdade é alocar um novo vetor com o novo tamanho, copiar todo o conteúdo do vetor original para o novo vetor e retornar o endereço inicial desse novo vetor. Então, percebe que o tamanho do vetor não foi alterado, ele apenas foi copiado para um vetor maior.

Código de exemplo completo de como utilizar a função realloc

/*
            Aula 200: Alocação dinâmica de memória com a função realloc(vet, tam);

            Código escrito por Wagner Gaspar
            Junho de 2021

        -> Retorna um ponteiro para a nova região de memória alocada.
        -> Se o ponteiro vet for nulo ela aloca tam bytes de memória.
        -> Se o novo tamanho for zero a memória de vet é liberada.
        -> Se não houver memória suficiente retorna null.
*/

#include <stdio.h>
#include <stdlib.h>

int main(){
    int i, tam, *vet;

    printf("Digite o tamanho do vetor: ");
    scanf("%d", &tam);
    srand(time(NULL));

    vet = malloc(tam * sizeof(int));

    if(vet){
        printf("Memoria alocada com sucesso!\n");
        for(i = 0; i < tam; i++)
            *(vet + i) = rand() % 100;

        for(i = 0; i < tam; i++)
            printf("%d ", *(vet + i));
        printf("\n");

        printf("Digite o novo tamanho do vetor: ");
        scanf("%d", &tam);

        vet = realloc(vet, tam);

        printf("\nVetor realocado:\n");
        for(i = 0; i < tam; i++)
            printf("%d ", *(vet + i));
        printf("\n");
    }
    else{
        printf("Erro ao alocar memoria!\n");
    }

    return 0;
}

Deixe um comentário

15 + 19 =

Wagner Gaspar

Capixaba de São Gabriel da Palha, Espírito Santo. Bacharel em Ciência da Computação pela Universidade Federal do Amazonas e mestre em informática pela Universidade Federal do Espírito Santo.