函数调用中的段违例错误

时间:2012-12-04 22:44:02

标签: c windows segmentation-fault

我有一个C程序,用于查找给定点集(随机生成)中所有点的k个最近邻居。问题是当我将点数(以及因此数组大小)增加到10000时,只要我调用函数找出最近的邻居,程序就会给出段违规错误。我无法使用调试器进入函数内部。一旦我执行“Step Into”,程序就会崩溃。

我使用过代码块和Eclipse CDT(在Windows 7上),并且都在同一点上给出错误。在代码块的情况下,它给出了段违规,并且在Eclipse的情况下它首先显示 - “0x4039a7处没有可用于__chkstk_ms()的源”,然后错误来自操作系统本身 - “KNN.exe已停止工作” 但是程序在Linux(Ubuntu 32bit)上运行良好。

以下是代码段:

#define MAX_SIZE 10000

    int main()
    {
        int n = MAX_SIZE;
        int k = 3;
        int i;


        double points[MAX_SIZE*2];  //2-D array in row-major order
        double result[MAX_SIZE*3*2];

        srand(time(NULL));

        for(i=0; i < n; i++)
        {
            points[i*2] = (double)rand()/(double)RAND_MAX;
            points[i*2 + 1] = (double)rand()/(double)RAND_MAX;
        }


        seek(points,n,k,result);   //<---------- ERROR

        seek(points,n,k,result);   //<------------ NO ERROR 
   ....
  }

 void seek(const double * const points, int n, int k, double *result)
 {

  TreeNode qtree[MAX_SIZE];
  int order_array[MAX_SIZE];

  int num_nodes = build_quadtree(a, n, k, qtree,order_array);   
  ......
  }

struct tree_node    {     int id;     int num_points;     int start_order;     int end_order;     int parent;     int child [4];     struct rectangle rect;     enum boolean is_leaf;    };

结构点   {     双x;     双y;   };

结构矩形   {     int id;     double xmin,xmax,ymin,ymax;     结构点midpt;   };

更令人困惑的是,我有另一个具有相同参数的函数,它运行没有任何问题。 请提供有关如何调试此内容的建议。

编辑: - 。我已经发布了前几行seek()函数。正如回复中指出的那样,我实际上是在寻找函数上分配了大量内存,但我想知道为什么它不是linux中的问题。

2 个答案:

答案 0 :(得分:3)

我认为你超出了可用的堆栈(请参阅_chkstk上的MSDN文档)。尝试动态分配数组

int main()
{
    double* points = malloc(sizeof(double) * MAX_SIZE*2];
    double* result = malloc(sizeof(double) * MAX_SIZE*3*2];
    ...
    free(points);
    free(result);
}

当您致电seek时,会发生堆栈溢出。您尚未为其发布代码,但可能还需要重新编写代码以减少其堆栈使用。

答案 1 :(得分:1)

也许以下代码是真正的罪魁祸首。 qtree和orderarray都是堆栈分配的。我会将MAX_SIZE更改为较低的值并查看问题重新进行。

TreeNode qtree [MAX_SIZE];   int order_array [MAX_SIZE];