[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



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