C 函数调用时出现段冲突错误

C 函数调用时出现段冲突错误,c,windows,segmentation-fault,C,Windows,Segmentation Fault,我写了一个C程序来寻找给定点集中所有点的k个最近邻(随机生成)。问题是,当我将点数(以及数组大小)增加到10000时,只要我调用函数查找最近邻,程序就会给出段冲突错误。我无法使用调试器进入函数内部。我一“进入”程序,程序就崩溃了 我使用了代码块和EclipseCDT(在Windows7上),它们都在同一点上给出了错误。在代码块的情况下,它给出了段冲突,在Eclipse的情况下,它首先显示“0x4039a7处没有可用于_chkstk_ms()的源代码”,然后错误来自操作系统本身-“KNN.exe已

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

我使用了代码块和EclipseCDT(在Windows7上),它们都在同一点上给出了错误。在代码块的情况下,它给出了段冲突,在Eclipse的情况下,它首先显示“0x4039a7处没有可用于_chkstk_ms()的源代码”,然后错误来自操作系统本身-“KNN.exe已停止工作” 不过,该程序在Linux(Ubuntu 32位)上运行良好

以下是代码片段:

#定义最大尺寸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);   
  ......
  }
intmain()
{
int n=最大尺寸;
int k=3;
int i;
两点[MAX_SIZE*2];//按行大顺序排列的二维数组
双结果[最大尺寸*3*2];
srand(时间(空));
对于(i=0;iseek(points,n,k,result);//我认为您超出了可用堆栈(请参阅上的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
时发生堆栈溢出。您尚未为其发布代码,但可能还必须对其进行返工以减少其堆栈使用量。

我认为您超出了可用堆栈(请参阅上的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
时,堆栈溢出正在发生。您尚未为其发布代码,但可能还必须对其进行返工以减少其堆栈使用量。

也许以下代码才是真正的罪魁祸首。qtree和orderarray也都是堆栈分配的。我会将MAX_SIZE更改为较低的值,然后查看问题的原因

TreeNode qtree[最大尺寸];
int order_array[MAX_SIZE];

也许下面的代码才是真正的罪魁祸首。qtree和orderarray都是堆栈分配的。我会将MAX_SIZE更改为较低的值,然后查看问题的答案

TreeNode qtree[最大尺寸];
int order_数组[MAX_SIZE];

有没有可能我们看到
seek()
正在做什么?点[]
的加载程序似乎没有任何问题。有没有可能我们看到
seek()
正在做什么?点[]的加载程序似乎没有任何问题。假设8字节双精度和4字节整数,此函数中使用的总堆栈为640012字节,这在Windows上CRT的1MB默认堆栈内。我同意
seek()
可能是问题所在。假设8字节双精度和4字节整数,此函数中使用的总堆栈为640012字节,这在Windows上CRT的1MB默认堆栈内。我同意
seek()
可能是问题所在。