O fclose gerando falha de segmentação

1. O fclose gerando falha de segmentação

Gisele Vieira Rocha
adahoff

(usa Red Hat)

Enviado em 26/02/2015 - 13:54h

Pessoal,
Estou com um problema sério. Estou construindo um programa e uma das rotinas está gerando o erro clássico "segmentation fault", qundo faço o teste da rotina em questão o problema ocorre quando incluo o "fclose" ao final. Se retiro o fclose a rotina posterior dá o seguinte erro: "memory corruption: 0x0000000002bf0960".

Segue abaixo a rotina em que o fclose não funciona:

int *A1,*A2, i, j, k,q; //A1: Phobic ; A2: Philic
FILE * out_lipo2;



out_lipo2=fopen("area_lipo.txt","w");

A1 = (int *)malloc(sizeof(int) * cav);
A2 = (int *)malloc(sizeof(int) * cav);


for(i = 0; i <= cav; i++)
{
A1[i] = 0.0; A2[i] = 0.0;
}

for(q=0;q<=cav;q++)
{
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
for(k=0;k<o;k++)
{

if(C[i][j][k]==q)
{
if(H[i][j][k] ==1)
{
A1[q]++;
}
if(H[i][j][k] ==-1)
{
A2[q]++;
}
}

}
}
}
}
for(i = 0; i <= cav; i++)
{

fprintf(out_lipo2,"Cavity K%c%c %5.d: PHOB= %8.3lf \tPHIL= %8.3lf \tAngstrons^2\n",65+(((i-2)/26)%26),65+((i)%26),i,(A1[i]*h*h),(A2[i]*h*h));
}
free(A1);
free(A2);
fclose(out_lipo2);






  


2. Re: O fclose gerando falha de segmentação

Paulo
paulo1205

(usa Ubuntu)

Enviado em 26/02/2015 - 16:22h

Se você aloca espaço para cav elementos, esses elementos têm índices que variam de 0 a cav-1. Da forma como você fez os seus loops com for, você está contando de 0 a cav, o que implica que está ultrapassando o elemento do final do array alocado em uma posição.

Possivelmente essa extrapolação está invadindo o espaço da variável out_lipo2, quer diretamente, no momento em que você faz atribuições aos elementos que excedem o espaço originalmente alocado para A1 e A2, quer no momento em que você chama o free() sobre elas. Com isso, o valor do objeto out_lipo2 está parcialmente ou totalmente corrompido no momento da passagem como argumento para fclose().


3. Re: O fclose gerando falha de segmentação

Gisele Vieira Rocha
adahoff

(usa Red Hat)

Enviado em 26/02/2015 - 16:48h


Caro Paulo
Obrigada pela resposta resolvi o problema com a falha de segmentação.
Consegui resolver o problema com o fclose mas ao passar para a próxima rotina a mensagem: "malloc(): memory corruption: 0x0000000002bf0960" continua a aparecer vc sabe me dizer o que está acontecendo?


4. Re: O fclose gerando falha de segmentação

Paulo
paulo1205

(usa Ubuntu)

Enviado em 26/02/2015 - 17:11h

adahoff escreveu:

Caro Paulo
Obrigada pela resposta resolvi o problema com a falha de segmentação.
Consegui resolver o problema com o fclose mas ao passar para a próxima rotina a mensagem: "malloc(): memory corruption: 0x0000000002bf0960" continua a aparecer vc sabe me dizer o que está acontecendo?


Tudo o que eu disse antes continua valendo. Você tem de tomar cuidado com índices de arrays, tanto os alocados dinamicamente por meio de ponteiros (casos de A1 e A2, no programa que você mostrou anteriormente) quanto os declarados explicitamente como arrays, mesmo em arrays multidimensionais (como o G e o H, dos quais você só mostrou uso, mas não a declaração). Se você diz que uma dimensão de um array tem N elementos, você tem de garantir que os índices a ela aplicados vão ser contados apenas de 0 a N-1.

Fora isso, outros erros comuns que afetam malloc(), realloc() e free(), e que talvez você queira verificar, são:

- Sobrescrever (intencionalmente ou acidentalmente, inclusive por veio de extrapolação de limites de arrays, como descrito acima) o valor de um ponteiro alocado com malloc()/realloc() com outro valor qualquer, que geralmente é estranho para as rotinas de gestão dinâmica de memória e atrapalha chamadas posteriores a realloc() e free().

- Chamar free() duas ou mais vezes sobre o mesmo ponteiro, mesmo que esse ponteiro inicialmente tivesse um valor válido.

- Ter várias variáveis ponteiro apontando para o mesmo objeto (aliasing), e indistintamente realizar operações de realocação ou liberação sobre algumas delas, e não refletir as alterações nas demais.

- Não testar o valor retornado por malloc() eou realloc() antes de utilizá-lo.

- Continuar usando um ponteiro depois de ter chamado free() sobre ele.

No seu caso, continuo apostando no problema que apontei antes.


5. Re: O fclose gerando falha de segmentação

Gisele Vieira Rocha
adahoff

(usa Red Hat)

Enviado em 27/02/2015 - 16:31h


Resolvido Paulo;

Obrigada!






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts