[英]Segmentation Fault: 11 on small input for array/vector
與stackoverflow上的此錯誤有關的幾個問題,我了解到它與數組過多的內存使用有關,或者與使用指針(我也對向量使用過)有關,但使用較小的數組時,它仍然顯示此錯誤。 之前的相同代碼運行良好(用於對數組進行合並排序)。
我的輸入如下:
5
9 8 1 2 4
輸出:
細分錯誤:11
#include<iostream>
#include<vector>
using namespace std;
void merge(vector <int> ar, int l, int m, int r){
int n1 = m-l+1;
int n2 = r-m;
int L[n1];
int R[n2];
for (int i = 0; i < n1; ++i)
{
L[i]=ar[l+i];
}
for (int j = 0; j < n2; ++j)
{
R[j]=ar[m+j+1];
}
int i,j;
i = j = 0;
int k = i;
while(i<n1 && j<n2){
if (L[i]<R[j])
{
ar[k]=L[i];
i++;
}
else if (R[j]<L[i])
{
ar[k]=R[j];
j++;
}
k++;
}
while(i<n1){
ar[k]=L[i];
i++;
k++;
}
while(j<n2){
ar[k]=R[j];
j++;
k++;
}
}
void mergesort(vector <int> ar, int l, int r){
int m;
m=r+(l-r)/2;
if (l<r)
{
mergesort(ar, l, m);
mergesort(ar, m+1, r);
merge(ar, l, m, r);
}
}
void print(vector <int> ar, int size){
for (int i = 0; i < size; ++i)
{
cout<<ar[i]<< " ";
}
}
int main()
{
int n;
cin>>n;
vector <int> ar;
for (int i = 0; i < n; ++i)
{
cin>>ar[i];
}
print(ar,n);
mergesort(ar, 0, n-1);
print(ar, n);
return 0;
}
問題部分在於m=r+(lr)/2
。 當l
為0
且r
為1
, (lr)/2
為0
。 這使m
等於1
, l
等於0
, r
等於1
,並且mergesort(ar, l, m);
稱其與剛剛通過的相同。 在出現分段錯誤之前,堆棧將無限增長。 解決此問題的一種方法也可以使您的代碼更有效,這是當l
和r
之間的差值低於某個閾值時合並列表。 或者,當到達l
和r
相差l
的點時,您可以交換兩個元素,如下所示:
if (l - r <= 1) {
int temp = ar[l];
ar[l] = ar[r];
ar[r] = temp;
return;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.