帮助进行有效的内存管理

我有一段代码,经过一些计算后会抛出“细分错误”。 我一直在寻找有效的内存管理方面的帮助。 我的程序执行以下操作: 我有一个最小的网格。 i,j,k坐标-52,-34,-35和最大i,j,k坐标53、37、33。(在i,j,k循环中)。 我想将每个网格点与具有约2000行x,y,z位置的* .pdb文件进行比较。 原子1756 OH2 TIP3W2710 -46.420 0.150 2.420 原子1757 OH2 TIP3W2753 19.800 2.170 -14.550 原子1758 OH2 TIP3W2754 18.150 20.090 12.270

因此,基本上在程序的主体中,我在compare()函数中将每个唯一的i,j,k值与每个x,y,z进行比较。 问题是程序经过1000个i,j,k值,然后给出分段错误。 继承程序:

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
main()
{
FILE *fp1;
float i, j, k;
int val;
 
fp1 = fopen("output.dat", "w");
 
 
 
for (i=-52; i <53; i++)
{
for(j=-34; j <37; j++)
{
for (k=-35; k <33; k++)
{
val= compare (i,j,k);
if (val>=1)
{
fprintf(fp1, "%f\t %f\t %f\t %d\n", i,j,k, val);
}
}
}
}
 
fclose(fp1);
}
compare (p,q,r)
float p,q,r ;
{
 
char cbuff[100];
char sx[7];
char sy[7];
char sz[7];
float a[2500];
float b[2500];
float c[2500];
float dist, num;
int count=0, i=0, j;
 
FILE *fp2;
fp2 = fopen("test1.pdb", "r");
 
while (fgets (cbuff, 80, fp2)!= NULL)
 
{
if (cbuff[0] =='A' && cbuff[1] == 'T' && cbuff[2] == 'O' && cbuff[3] == 'M')
{
strncpy (sx, cbuff+31, 7);
sx[7] = '\0';
strncpy (sy, cbuff+40, 7);
sy[7] = '\0';
strncpy (sz, cbuff+47, 7);
sz[7] = '\0';
a[i] = atof(sx);
b[i] = atof(sy);
c[i] = atof(sz);
/*printf("%d\t%f\t%f\t%f\n", i, a[i], b[i], c[i]);*/
i++;
}
}
 
for(i=0; i < 2013; i++)
{
num = (pow ((c[i]-r),2) + pow ((b[i]-q),2) + pow((a[i]-p),2));
dist = sqrt (num);
if (dist < 1 )
{
count++;
printf("%f\n", dist);
}
}
 
return(count);
fclose(fp2);
}