2012-12-04 78 views
0

我有一個書面的C程序來查找給定點集合(隨機生成)中所有點的k個最近鄰居。問題是當我將點數(因此數組大小)增加到10000時,只要我調用函數來找出最近的鄰居,程序就會給出段違例錯誤。我無法使用調試器進入函數。一旦我做了一個「步入」程序崩潰。函數調用時段違例錯誤

我已經使用了代碼塊和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); 
    ...... 
    } 

結構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} double y; };

struct rectangle { int id; double xmin,xmax,ymin,ymax; struct point midpt; };

什麼是更令人困惑的是,我有另一個功能相同的參數運行沒有任何問題。 請提供關於如何調試的建議。

編輯: - 。我發佈了seek()函數的前幾行。正如答覆所指出的,我實際上在seek功能上分配了很多內存,但我想知道爲什麼它在linux中不是問題。

+0

任何機會都可以看到'seek()'在做什麼? 'points []'的加載器似乎沒有任何問題。 – WhozCraig

回答

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。您尚未發佈代碼,但可能需要重新編寫代碼以減少堆棧使用。

+2

假設8字節雙精度和4字節整數,此函數中使用的總堆棧數爲640012字節,這完全在Windows的CRT的1MB默認堆棧內。我同意「尋求()」可能是問題。 – WhozCraig

1

也許下面的代碼是真正的罪魁禍首。 qtree和orderarray都是堆棧分配的。我會將MAX_SIZE更改爲較低的值,並查看問題重新計算。

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