[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



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>