由于类型为size_t的引用变量而导致分段故障核心转储

问题描述

下面的代码用于执行合并排序。向量已正确排序。我已经通过了size_t类型的引用变量num传递了。在作为参考传递之前,此变量已初始化为零。在指定位置访问变量会导致分段故障核心转储。但是,在merge_sort函数的其他部分中访问它不会导致任何错误并给出预期的结果。 很少有人尝试过在同一行代码之前未引起任何错误,但突然间它开始引起分段错误核心转储。 我想知道为什么会这样。

#include<iostream>
#include<vector>
#include<cstdlib>
#define N_LIM 5
#define NUM_LIM 5
using namespace std;
size_t naive(vector<int> &a)
{
    size_t i=0,j=0,l=a.size()-1,k=0;
    for(i=0;i<l;i++)
        for(j=i+1;j<=l;j++)
            if(a[i]>a[j])
                k++;
    return k;
}
void merge_sort(vector<int> &a,size_t m,size_t n,size_t &num,vector<int> &temp)
{
    if(m<n)
    {
        size_t l=(m+n)/2,ans=0;
        merge_sort(a,m,l,num,temp);
        merge_sort(a,l+1,n,temp);
        size_t p=m,q=l+1,r=m;
        while(p<=l && q<=n)
        {
            if(a[p]<=a[q])
            {
                temp[r]=a[p];
                r++;
                p++;
            }
            else
            {
                temp[r]=a[q];
                r++;
                q++;
//num=num+l-p+1;    causes segmentation fault   num has been initialised to zero before 1st call to merge_sort
                ans+=l-p+1;
            }
        }
        while(p<=l)
        {
            temp[r]=a[p];
            p++;
            r++;
        }
        while(q<=n)
        {
            temp[r]=a[q];
            r++;
            q++;
        }
        for(size_t i=m;i<r;i++)
            a[i]=temp[i];
//  num=444;    num can be accessed here without any problem
    }
}
size_t inversion(vector<int> &a,bool f=0)
{
    size_t num=0;
    vector<int> temp(a.size());
    merge_sort(a,a.size()-1,temp);
    if(f==1)
    {
        for(size_t i=0;i<a.size();i++)
            cout<<a[i]<<" ";
        cout<<endl;
    }
    return num;
}
int stress_test()
{
    int n=rand()%N_LIM;
    vector<int> a(n),b(n);
    for(size_t i=0;i<n;i++)
        a[i]=b[i]=rand()%NUM_LIM;
    size_t ans1=naive(a);
    size_t ans2=inversion(a);
    if(ans1==ans2)
        return 0;
    else
    {
        cout<<"Input :";
        for(size_t i=0;i<n;i++)
            cout<<" "<<b[i];
        cout<<endl<<"Output :";
        for(size_t i=0;i<n;i++)
            cout<<" "<<a[i];
        cout<<endl<<"Ans_Naive = "<<ans1<<"\t"<<"Ans = "<<ans2<<endl;
        return 1;
    }
}
int main(void)
{
    size_t z=0;
    while(++z<1000)
    {
        if(stress_test()==1)
            break;
    }
    size_t n=0;
    cin>>n;
    vector<int> a(n);
    for(size_t i=0;i<n;i++)
        cin>>a[i];
    size_t k=inversion(a,1);
    cout<<k<<endl;
    return 0;
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)