我编写了一个 C 程序来查找给定点集(随机生成)中所有点的 k 个最近邻居。问题是当我将点数(以及因此数组大小)增加到 10000 时,程序会在我调用该函数以找出最近的邻居时立即给出段违规错误。我无法使用调试器进入函数内部。一旦我执行“Step Into”,程序就会崩溃。
我使用过代码块和 Eclipse CDT(在 Windows 7 上),两者都在同一点出现错误。在代码块的情况下,它会导致段冲突,在 Eclipse 的情况下,它首先显示 - “0x4039a7 处没有可用于 __chkstk_ms() 的源”,然后错误来自操作系统本身 - “KNN.exe 已停止工作” 然而,该程序在 Linux(Ubuntu 32 位)上运行良好。
这是代码片段:
#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);
......
}
结构树节点 { 内部编号; int num_points; int start_order; int end_order; 内部 parent ; 诠释 child [4]; 结构矩形矩形; 枚举 bool 值 is_leaf; };
结构点 { 双 x; 双y; };
结构矩形 { 内部编号; 双 xmin,xmax,ymin,ymax; 结构点中点; };
更令人困惑的是,我有另一个具有相同参数的函数,它运行没有任何问题。 请提供有关如何调试此问题的建议。
编辑:- 。我已经发布了 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
时发生堆栈溢出。您还没有为它发布代码,但可能还需要对其进行返工以减少其堆栈使用。
关于c - 函数调用时出现段冲突错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13713311/