[Prévia cron] [Próxima Cron] [Prévia por assunto] [Próxima por assunto]
[Índice cronológico]
[Índice de assunto]
[Índice de autor]
Re: Ponteiros
- Subject: Re: Ponteiros
- From: Imre Simon <is@ime.usp.br>
- Date: Wed, 15 Nov 2000 17:47:59 -0300
Vinicius,
a sua pergunta é muito interessante e oportuna, por isto estou
encaminhando cópia da resposta para a lista da disciplina.
Em C o efeito de malloc é global, ou seja, a memória alocada durante a
execução de um procedimento continua viva e utilizável, mesmo depois
do término da execução do procedimento. Para liberar a memória alocada
é necessário executar a função free.
Note, porém, que no caso do seu exemplo, a variável v é uma variável
local, ou seja v morre com o procedimento. Mas como Você tomou o
cuidado de exportar o valor de v, a memória alocada pode ser acessada
após a execução de func().
O livro KR tem um exemplo muito parecido com o que Você faz. Veja no
final da seção 6.5 Self-referential Structures.
Um exercício interessante é fazer um programa que usando este fato faz
muitas chamadas a func() sem limpar o lixo. A memória vai estourar. No
meu computador, com Linux, aparece uma mensagem de "Killed" se o abuso
for maior do que a capacidade do sistema. Tou até curioso para saber o
que acontece nos Cs do Windows. Alguém experimenta?
Imre Simon
: Date: Tue, 14 Nov 2000 13:37:05 -0200 (BRDT)
: From: Vinicius Cifu Lopes <vclopes@linux.ime.usp.br>
: To: is@ime.usp.br
: Subject: Ponteiros
:
: Caro professor,
: Busquei no KR mas não achei.
: Suponha que tenhamos uma função:
: int* func (/*...*/) {
: int* v;
: v = malloc(N*sizeof(int));
: /*...*/
: return v; }
: Então o procedimento que chamou func agora dispõe de um endereço
: apontando para o início do vetor alocado em func. Mas o sistema sabe disso
: ? Em outras palavras, a memória continua alocada ?
: Grato,
: Vinicius <vclopes@linux.ime.usp.br>