我写了一个C程序来查找给定点集中所有点的k个最近邻居(随机生成)。问题是,当我将点的数量(以及数组大小)增加到10000时,一旦我调用函数来查找最近的邻居,程序就会出现段冲突错误。我无法使用调试器进入函数内部。我一执行"Step Into",程序就会崩溃。
我使用了代码块和EclipseCDT(在Windows7上),两者都在同一点上给出了错误。在代码块的情况下,它给出了段冲突,在Eclipse的情况下它首先显示-"0x4039a7处没有可用于__chkstk_ms()的源",然后错误来自操作系统本身-"KNN.exe已停止工作"然而,该程序在Linux(Ubuntu 32位)上运行良好。
以下是代码片段:
#定义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);
......
}
结构树节点{int id;int num_points;int start_order;int end_order;int父;int child[4];结构矩形rect;enum布尔值is_leaf;};
结构点{双x;双y;};
结构矩形{int id;双xmin、xmax、ymin、ymax;结构点midpt;};
更令人困惑的是,我有另一个具有相同参数的函数,它正在毫无问题地运行。请提供有关如何调试的建议。
编辑:-。我已经发布了seek()函数的前几行。正如回复所指出的,我实际上在seek函数上分配了很多内存,但我想知道为什么它在linux中不是问题。
我认为您已经超出了可用堆栈(请参阅_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
时会发生堆栈溢出。您还没有发布它的代码,但可能还必须对其进行返工,以减少其堆栈使用。
也许下面的代码才是真正的罪魁祸首。qtree和orderarray也是堆栈分配的。我会将MAX_SIZE更改为一个较低的值,然后再查看问题。
树节点qtree[MAX_SIZE];int order_array[MAX_SIZE];