[Prévia cron] [Próxima Cron] [Prévia por assunto] [Próxima por assunto]
[Índice cronológico]
[Índice de assunto]
[Índice de autor]
RE: pau em malloc
- Subject: RE: pau em malloc
- From: Paulo Feofiloff <pf@ime.usp.br>
- Date: Thu, 26 Aug 1999 17:49:54 -0300
Leo Watanabe writes:
> Este problema ocorreu em meu programa e pode ser diferente de compilador
> para compilador. Utilizo o Borlando c++ 4.0.
> Quando tentava alocar memoria para um numero grande de pontos no programa
> ele dava pau, simplesmente fechava o compilador.
> Apesar de usar um verificador na hora de alocar memoria (!NULL), este
> funcionava para uma faixa reduzida de valores, i.e. quando utilizava um
> valor proximo de 8000, o verificador funcionava e emitia um aviso de
> memoria insuficiente. mas com valores maiores como 10000 ele passava pelo
> verificador sem emitir o aviso e dava pau.
> Debugando o programa encontrei o problema. A funcao malloc recebe o valor
> em bytes que se deve alocar ( malloc (num. de bytes) ) e este num. de
> bytes eh do tipo size_t. O maximo de size_t eh 64Kbytes. O problema
> ocorria quando size_t ultrapassava o limite, retornando a zero. Ou seja
> alocava menos memoria do que necessitava, sem dar erro pois ele pensava
> estar alocando memoria suficiente.
> Acho que a explicacao dada pelo prof. em aula foi suficiente para
> entender o problema.
Se bem me lembro, minha tentativa de explicação foi a seguinte.
Digamos que o meu tipo-de-dados inteiro
(bem... para ser mais exato, devemos estar falando aqui do
tipo-de-dados size_t, que equivale a unsigned int)
tem conjunto de valores 0,1,...,65535.
A operação de + e * funcionam de maneira circular:
65535+1 = 0,
65535+2 = 1,
32785*2 = 34,
etc.
Digamos que meus ints ocupam 2 bytes e que quero alocar memória
para 32785 inteiros:
malloc (32785 * sizeof(int));
Esta chamada de malloc vai alocar apenas 34 bytes
(e não os 65570 que eu gostaria).
Estou certo? Ou falei bobagem.
PF