duvida função free() [RESOLVIDO]

1. duvida função free() [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 24/06/2011 - 18:13h

ola pessoal
após liberar a memória alocada nesse programa em C, p->j continua com valor 'a'. Depois de free(p) toda a estrutura apontada por p não deveria ser apagada?

#include <stdio.h>
#include <stdlib.h>

struct dados {
int i;
char j;
} *p;

main() {
p = (struct dados *)malloc(sizeof(struct dados));

(*p).i = 10;
(*p).j = 'a';

free(p);

printf("%d", (*p).i); //saída: 0
printf("%c", (*p).j); //saída: a
}


  


2. MELHOR RESPOSTA

Enzo de Brito Ferber
EnzoFerber

(usa FreeBSD)

Enviado em 27/06/2011 - 08:19h

Opa!

Não, a função free() não apaga a informação contida na memória, ela apenas libera esse bloco de memória para ser usado novamente. Mas como o ponteiro 'p' ainda continua apontando para o mesmo endereço, você consegue ler. Cuidado, isso as vezes gera Segmentation Fault ou Illegal Instruction, e causa 'crash'.

malloc() apenas permite que você associe um valor à um determinado valor de memória.
free() 'tira' essa permissão, e devolve a memoria para uso geral do computador/programa.

Qualquer coisa posta denovo,
Enzo Ferber
[]'s

3. Re: duvida função free() [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 27/06/2011 - 10:54h

entao apos free(p), não é que o conteúdo do endereço apontado por 'p' foi apagado, o que ocorre é que esse endereço pode ser usado para armazenar novos dados, é isso mesmo?


4. Re: duvida função free() [RESOLVIDO]

Enzo de Brito Ferber
EnzoFerber

(usa FreeBSD)

Enviado em 27/06/2011 - 11:04h

Depois de free(p), o endereço apontado por 'p' poderá ser alocado novamente e usado para armazenar outro valor.

Por exemplo:

E | C
1 |
2 |
3 |
4 |

Sendo 'E' endereço e 'C' conteúdo.

Você aloca memória para um ponteiro, assim:

ponteiro = malloc(1)

*ponteiro = VIVA O LINUX

E | C
1 |
2 | VIVA O LINUX
3 |
4 |

Agora o endereço de 'ponteiro' é 2 (esse endereço você nao escolhe, é dado por malloc())
E o conteúdo do endereço 2 é VIVA O LINUX.

Neste momento, o computador não pode alocar essa memória denovo, elá é reservada por malloc().

Se você fizer free(ponteiro), a memoria vai ficar assim:
E | C
1 |
2 | VIVA O LINUX
3 |
4 |

Não muda, o endereço para qual 'ponteiro' aponta continua sendo 2 e o conteúdo continua sendo o mesmo. Mas agora malloc() poderá usar esse endereço denovo, para outra alocação.

Para você apagar o valor, você pode colocar um 0x0 no primeiro byte do ponteiro, assim:

*ponteiro = 0x0;

Ou simplesmente apagar o endereço para o qual ele aponta:

ponteiro = 0x0;

Espero ter ajudado,
Qualquer coisa posta denovo,
Enzo Ferber
[]'s



5. Codigo

Enzo de Brito Ferber
EnzoFerber

(usa FreeBSD)

Enviado em 27/06/2011 - 11:15h

#include <stdio.h>
#include <stdlib.h>

int main ( void )
{
int *p = (int *) malloc( 1 * sizeof(int));
int *a;

*p = 10;

printf ( "Endereco: 0x%p\n", p );
printf ( "Valor: %d\n", *p );
printf ( "\nEntre com um endereco: ");
scanf ( "%p", &a );
printf ( "Valor de 0x%p: %d\n", a, *a );

printf ( "[*] free(p)\n" );

free ( p );

*a = 20;

printf ( "Valor de a(0x%p): %d\n", a, *a );



return 0;
}


Nesse codigo por exemplo, se você comentar a linha free(p), ainda assim o programa vai alterar o valor de 'a'.
A única coisa que free() faz é permitir a realocação daquele bloco de memória, mais ela não apaga as informações que lá estiverem.

Enzo Ferber
[]'s


6. Re: duvida função free() [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 27/06/2011 - 11:15h

otima explicaçao Enzo, agora ficou bem entendido, obrigado pela ajuda.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts