簡體   English   中英

函數調用上的段違規錯誤

[英]segment violation error on function call

我編寫了一個C程序來查找給定點集(隨機生成)中所有點的k個最近鄰居。 問題是,當我將點的數量(以及數組的大小)增加到10000時,一旦我調用該函數以找出最近的鄰居,程序就會發出段沖突錯誤。 我無法使用調試器進入該函數。 一旦執行“進入”程序就會崩潰。

我使用了代碼塊和Eclipse CDT(在Windows 7上),並且都在同一點給出了錯誤。 在代碼塊的情況下,它會導致段沖突,而在Eclipse的情況下,它首先會顯示-“在0x4039a7處__chkstk_ms()沒有可用的源”,然后錯誤來自操作系統本身-“ KNN.exe已停止工作”。程序可以在Linux(Ubuntu 32位)上正常運行。

這是代碼片段:

#定義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 [4]; 矩形矩形 枚舉boolean is_leaf; };

結構點{double x; y };

結構矩形{int id; 雙倍xmin,xmax,ymin,ymax; 結構點中間 };

更加令人困惑的是,我還有另一個帶有相同參數的函數正在運行,沒有任何問題。 請提供有關調試方法的建議。

編輯:-。 我已經發布了seek()函數的前幾行。 正如答復指出的那樣,我實際上是在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時發生堆棧溢出。 您尚未為其發布代碼,但可能還必須對其進行重新處理以減少其堆棧使用。

也許下面的代碼才是真正的罪魁禍首。 qtree和orderarray也是堆棧分配的。 我將MAX_SIZE更改為較低的值,然后再次看到問題。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM