2012-12-04 3 views
0

주어진 포인트 집합 (임의로 생성 된)에서 모든 점의 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에서 왜 문제가되는지 궁금합니다.

+0

우리는'seek()'이하고있는 것을 볼 수 있습니다. 'points []'에 대한 로더는 아무런 문제가없는 것 같습니다. – WhozCraig

답변

3

사용 가능한 스택을 초과했다고 생각합니다 (MSDN 문서 _chkstk 참조). 당신이 seek를 호출 할 때 동적으로 대신 스택 오버 플로우가 일어나는

int main() 
{ 
    double* points = malloc(sizeof(double) * MAX_SIZE*2]; 
    double* result = malloc(sizeof(double) * MAX_SIZE*3*2]; 
    ... 
    free(points); 
    free(result); 
} 

배열을 할당하십시오. 코드를 게시하지 않았지만 스택 사용을 줄이기 위해 코드를 다시 작성해야 할 수도 있습니다.

+2

8 바이트 double과 4 바이트 int를 가정하면이 함수 내에서 사용되는 총 스택은 640012 바이트이며 이는 Windows에서 CRT의 1MB 기본 스택 내에 있습니다. 나는'seek()'이 문제라고 동의한다. – WhozCraig

1

아마 다음 코드가 진짜 원인입니다. qtree와 orderarray도 스택에 할당됩니다. MAX_SIZE를 낮은 값으로 변경하고 문제가 다시 발생하는지 확인합니다.

TreeNode qtree [MAX_SIZE]; int order_array [MAX_SIZE];