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

  • 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. [...]

    Responder

Leave a Comment

Required

Required, hidden

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


 

Janeiro 2008
S T Q Q S S D
« Dez   Mai »
 123456
78910111213
14151617181920
21222324252627
28293031  

Principais mensagens

Tópicos recentes

Feeds