주어진 포인트 집합 (임의로 생성 된)에서 모든 점의 k 개의 가장 가까운 이웃을 찾기 위해 작성된 C 프로그램이 있습니다. 문제는 점의 수를 (그리고 결과적으로 배열의 크기) 10000으로 증가시킬 때 가장 가까운 이웃을 찾는 함수를 호출하자마자 프로그램이 세그먼트 위반 오류를 발생시키는 것입니다. 디버거를 사용하여 함수 내부에 들어갈 수 없습니다. "Step Into"를하면 프로그램이 중단됩니다.함수 호출시 세그먼트 위반 오류
필자는 코드 블록과 Eclipse CDT (Windows 7)를 사용했으며 둘 다 같은 지점에서 오류를 제공합니다. 코드 블록의 경우 세그먼트 위반이 발생하고 Eclipse의 경우 "0x4039a7에서 __chkstk_ms()에 사용할 수있는 소스가 없습니다"오류가 OS 자체에서 발생합니다 - "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);
......
}
구조체 tree_node { INT 아이디; int num_points; int start_order; int end_order; int 부모; int child [4]; struct rectangle rect; enum boolean is_leaf; };
struct point { double x; double y; };
구조 사각형 { int id; double xmin, xmax, ymin, ymax; struct point midpt; };
더 혼란스러운 점은 문제없이 실행되는 동일한 인수를 가진 또 다른 기능이 있다는 것입니다. 디버깅 방법에 대한 제안 사항을 제공해주십시오.
편집 : -. seek() 함수의 처음 몇 줄을 게시했습니다. 답장에서 지적한 것처럼 실제로 seek 함수에 많은 메모리를 할당하고 있지만 Linux에서 왜 문제가되는지 궁금합니다.
우리는'seek()'이하고있는 것을 볼 수 있습니다. 'points []'에 대한 로더는 아무런 문제가없는 것 같습니다. – WhozCraig