GAMBCODES

Vetor dinâmico em C

Após umas férias merecidas da faculdade, trabalho e afins. Volto-me a língua de programação C.  Para quem não conhece, a linguagem C é a mãe de inúmeras linguagens de programação modernas, como por exemplo: Java, C++, C# e entre outras. Acho muito bom para os iniciantes em programação começarem pelo C (como no meu caso), pois ao dominá-la fica mais fácil aprender outras linguagens.
Recentemente navegando no site URI Onlie Judge (neste site é possível resolver problemas usando C e entre outras linguagens e competir com outros usuários! Muito interessante para a prática de programação!) me deparei com um problema que foi necessário a utilização de vetores dinâmicos. Alocação dinâmica em C é algo muito interessando, no entanto,  algo que se torna de certa forma complexo para o iniciante em programação.
Para a realização este procedimento o programador deve ter conhecimentos básicos sobre ponteiros (o terror de muitos). Em posts futuros falarei mais sobre ponteiros.
Um vetor em C na verdade é um ponteiro, onde ao declaramos um vetor do tipo int:
 int array[100];

Equivale a:

int* array;

No entanto, quando trabalhamos com ponteiros é necessário realizar a alocação de memória manualmente. E para realizar está tarefa trabalhamos com uma função chamada malloc. Com ela é possível realizar a alocação dinâmica de memória. Veja um exemplo da função malloc:
int* array;
int n = 10;
array= (int*)malloc(sizeof(int)*n);
Como a função retorna void* é necessário fazer o type casting para int ((int*)). É necessário passar para para a função a quantidade de bytes para se alocar na memória, por este motivo utilizamos o operador sizeof que diz quantos bytes o tipo especifico tem. Neste exemplo alocamos 10 espaços na memória para uma variável do tipo int, o que equivale a int array[10].

Mas com o malloc  não é possível realocar um espaço de memória já alocado, para tal usamos a função chamada realloc.
Veja no exemplo:

 array = (int*)realloc(array, i * sizeof(int));

É passada para a função primeiro um ponteiro que pode ser já alocado com o malloc, calloc ou até mesmo com o realloc, ou até mesmo nulo, onde um novo bloco de memória é alocado; e além do ponteiro, deve-se passa a quantidade em bytes que se deve realocar, igualmente ao malloc. E como no malloc o realloc retorna um void*.

Tendo em mente que com o realloc é possível realocar memória, temos a possibilidade de criar um vetor que cresce ou diminua conforme a necessidade do programador. No meu casso foi necessário armazenar os dígitos de um número indefinido em um vetor, e para isso utilizei a alocação de memória dinâmica para resolver meu problema. Vejamos:

 int num;
 int *aux = NULL;
 int *dig= NULL;
 int temp = 0;
 int n;
 int i = 0;
 
 scanf("%d",&num);

 while(num > 0)
 {
 temp = num % 10;
 num /= 10; 
 i++;
 
 aux = (int*) realloc (dig, i * sizeof(int));
 
 if(aux != NULL)
 {
 dig = aux;
 dig[i - 1] = temp; 
 } 
 }

 for(n = 0; n < i; n++)
{
   printf(" %d ",dig[n]);
}

free(dig);
dig = NULL;

Dois ponteiros nulos foram criados: Um auxiliar e outro que irá armazenar os dígitos. Conforme é realizado o algorítimo para obter os dígitos a função realloc é chamada. Ou seja, no ponteiro aux é armazenado o resultada da função realloc. Neste caso o realloc recebe o ponteiro dig e o espaço de memória equivalente a quantidade de dígitos obtidos; que está armazenado na variável i. Se o resultado da função não for NULL é armazenado no ponteiro o resultado obtido em aux. 

Se vocês não perceberam há uma função que eu não mencionei, que é a função free, está função libera recursos de memória de um ponteiro. Pois quando se utiliza alocação de memória dinâmica os recursos alocados permanecem na memória mesmo depois de fechar a aplicação. E não queremos que engraçadinhos fiquem fuçando nos restos de memória das nossa aplicação, não é mesmo? É isso que os hackers mais gostam. 


É sim o vetor está com o resulta invertido. Futuramente ensinarei como corrigir este problema...

Comments

comments

Categories:   C

Tags:  , ,

Comments