[英]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.