我有一个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中的问题。
答案 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];