为什么在此代码中出现运行时错误SIGSEGV

时间:2020-03-19 10:04:52

标签: c++ segmentation-fault c++14

今天我正在Codechef https://www.codechef.com/problems/CHPINTU上解决问题,在这里我得到了运行时错误sigsegv,下面的代码是请帮助我。以下是C ++代码

    while(t!=0){
        int n,m;
        cin>>n>>m;
        int f[n],p[n];

        for(int i=0;i<n;i++)
            cin>>f[i];
        for(int i=0;i<n;i++)
            cin>>p[i];

        int freq[m+1];
        bool avail[m+1];
        memset(avail,false,sizeof(avail));
        memset(freq,-1,sizeof(freq));

        for(int i=0;i<n;i++){
            freq[f[i]]+=p[i];
            avail[f[i]]=true;

        }
        int min = INT_MAX;
        for(int i=0;i<=m;i++){
            if(freq[i]<min && avail[i]==true){
                min=freq[i];
            }
        }
        cout<<min<<"\n";
        t--;
    }

2 个答案:

答案 0 :(得分:0)

cin>>n>>m;
int f[n],p[n];

数组的长度不能为变量。 您可以使用vectornew

vector<int> f(n);
//or
int *f = new int[n];
//remember to delete after new

在您的代码中发现其他错误:

memset(freq,-1,sizeof(freq));
freq[f[i]]+=p[i];

freq [i]是类型i的总价。因此,应该将freq [i]初始化为0而不是-1。

您可以使用freq[i]==0来确定是否有这样的篮子。这样可以节省avail占用的内存。

答案 1 :(得分:0)

我可以在您的代码中找到两个问题。 首先,对于所有'i'值,f [i]不能为0。因此,freq [0]将具有一些垃圾值,您将其与'min'进行比较。您可以尝试减去1,然后将其用作freq数组中的索引。

freq[f[i]-1]+=p[i];` avail[f[i]-1] = true;`

还可以将频率的大小更改为“ m”而不是“ m + 1”。 其次,将freq数组初始化为0而不是-1,因为您正在为其索引添加值,因此-1作为初始值将更改最终结果。

memset(freq,0,sizeof(freq));

进行这些更改后,我提交了一份意见书,并被接受。您也可以尝试。