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; }