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 a nova quantidade de bytes que desejamos. Seu retorno é o endereço inicial da região de memória alocada.
// vet - vetor cujo tamanho desejamos aumentar
// qtd - nova quantidade de bytes do vetor (tamanho * sizeof(int) por exemplo)
vet = realloc(vet, qtd);
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 * sizeof(int));
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;
}
