Free(), passagem por referência e a minha função
13 Janeiro 2008
Continuando o artigo Entendendo ponteiros e a função malloc.
O uso de ponteiros permite modificar o valor de outras variáveis, então o que acontece se nós usarmos ponteiros ao invés de variáveis como parâmetros de uma função? O valor da variável que teve o seu endereço passado como parâmetro poderá ser modificado na função, afinal se uma variável em main teve o seu endereço passado como parâmetro para a função que atribui esse valor em um ponteiro será criado uma referência entre o ponteiro e a variável e quando for modificado o valor para o qual o ponteiro aponta o valor da variável também será modificado.
Para se fazer isso você deve lembrar que o uso do simbolo “&” fornece o endereço da variável na memoria para usar nos ponteiros e que para se declarar um ponteiro nós colocamos um “*” na frente do nome do ponteiro, lembrando disso é possível criar funções com passagem por referência.
Então você deve declarar a função dessa maneira:
exemplo(int *ponteiro);
Assim você vai estar criando um ponteiro para inteiros, não uma variável, e quando você for usar a função em main você deve usar assim:
int i;
exemplo(&i);
Afinal de contas, o valor de um ponteiro deve ser o endereço na memoria de um variável, e dentro da função você deve mudar o valor da variável para a qual o ponteiro aponta usando o “*” na frente do nome do ponteiro, isso é passagem por referencia, simples assim.
Aqui fica o exemplo da minha função primos, não é a melhor implementação, mas é funcional:
int primos(int num,int *vetor){
int i, aux, candidato, num_primos, loop, *ptr;
// definir os dois primeiros numeros primos
*vetor=2;
*(vetor+1)=3;
// definindo numero de primos conhecidos
num_primos=2;
// candidato comeca do proximo numero primo(5)
// candidato de 2 em 2 para evitar numeros pares
for(candidato=5;candidato<=num;candidato+=2){
loop = 1;
// i=1 porque nao ha pares
for(i=1;loop;i++){
// testando se o candidato e multiplo de algum numero
if(candidato % *(vetor+i) == 0){
// sem verdadeiro, sair do loop pois nao e primo
loop = 0;
}
aux = *(vetor+i);
// se o quadrado do numero primo for maior
// que o candidato esse sera primo
if(aux*aux > candidato){
loop = 0;
*(vetor+num_primos)=candidato;
num_primos++;
}
}
}
return num_primos;
}
Um ponto importante sobre a memória alocada através da função malloc é que ela é persistente, isso significa que há duas maneiras de libera-la para uso novamente, dizendo para a memoria ser liberada ou fechando o programa e isso trás uma importante implicação, se você continuar usando a memória do computador e não liberta-la o resultado provavelmente vai ser um vazamento de memória, aqui entra a função free:
void free(void *pointer);
Desse jeito:
int *p;
p = (int *)malloc(sizeof(int)*5);
if(p == NULL){
exit(EXIT_FAILURE);
}
free(p);
Tudo o que nós precisamos fazer é passar o ponteiro desnecessário para a função free() que vai dizer ao sistema operacional que o espaço armazenado pela função malloc() pode ser reutilizado.
Agora duas notas, 1. A função free() não destrói o ponteiro, você poderá usa-lo novamente. 2. A função diz ao sistema operacional que aquele espaço da memória está livre, e que ele pode designa-lo a outro programa, e até isso não acontecer os dados não serão modificados e você não terá restrição de acesso a esse espaço da memória, mas mesmo assim, não use o vetor depois de passar o ponteiro pela função free() porque inevitavelmente alguma hora o espaço vai ser reutilizado.
Entry Filed under: C. .
1 Comment Add your own
Leave a Comment
Some HTML allowed:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <pre> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>
Trackback this post | Subscribe to the comments via RSS Feed
1. Entendendo ponteiros e a função malloc « Avallon | 13 Janeiro 2008 at 7:25 pm
[...] Bem, agora nós já sabemos como usar os ponteiros e a função malloc(), agora temos mais três passos, entender a função free(), entender passagem por referência e por fim, a minha função primos() no próximo post. [...]