释放内存整数数组时的分段错误

时间:2013-05-21 02:29:28

标签: c arrays integer segmentation-fault

所以基本上我的问题是在这个函数中,而我正试图从数组q释放内存。

int makegrid (float *x, float *y, float squaresize, float map, int npoints)
{

  int score=0, i;

  int m = map/squaresize;
  int nsqr = m*m;
  int *q;
  q = NULL;
  q = (int *) malloc (sizeof(int)*nsqr);    

  for(i=0;i<nsqr;i++)
    q[i] = 0;



  int helper1 = 0;
  int helper2;
  float helperf;

  for(i = 0; i < npoints; i++)
  {
     helperf = x[i] - E;
     helper1 = floor(helperf/squaresize)*(m); 

     helperf = y[i] - E;
     helper2 = floor(helperf/squaresize);

     helper1 += helper2;
     q[helper1]++;

  }

  for(i=0;i<nsqr;i++)
  { 
     if(q[i] >= 1 && q[i] <= 4)
        score--;
     else if (q[i] == 0)
        score++;
     else
        score+=5;
  }

  free(q);
  q = NULL;

  return score; 
}

该函数的目标是为某个生成的网格创建一个分数,map是整个网格的大小,而squareize是网格中每个方块的大小,npoints是x和y向量的大小,这个函数由一个改变squareize的循环调用。

我不知道免费有什么问题,我很欣赏建议(x和y数组的大小应该高于5k)

1 个答案:

答案 0 :(得分:1)

当你在其他地方弄乱你的记忆时,免费通常会失败。它之前并不是段错误,因为内存是你的,但是你已经搞砸了内存管理数据结构,因此可以自由访问内存。

几乎可以保证这一行:

 q[helper1]++;

如果是helper1&gt;则在此之前放置一个断言(或打印) nsqr

 printf("TOO BIG!  %d > %d\n", helper1, nsqr);
 q[helper1]++;

..或根据评论,检查负数。