簡體   English   中英

分段故障:陣列/向量的小輸入為11

[英]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 l0r1(lr)/20 這使m等於1l等於0r等於1 ,並且mergesort(ar, l, m); 稱其與剛剛通過的相同。 在出現分段錯誤之前,堆棧將無限增長。 解決此問題的一種方法也可以使您的代碼更有效,這是當lr之間的差值低於某個閾值時合並列表。 或者,當到達lr相差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.

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