首页 > 解决方案 > 为什么这个 RE(SIGSEGV) 错误在提交时出现在 C++ 中?

问题描述

在提交代码时,我收到了 RE(SIGSEGV) 错误。我的代码是:

#include <bits/stdc++.h>
using namespace std;

int main()
{
    int T,val,v;
    int min = INT_MAX;
    int N,M;
    cin >> T;
    while(T--){
        cin >> N >> M;
        vector<int> vec(M+1,0);
        vector<int> arr1;
        for(int i=0;i<N;i++){
            cin >> v;
            arr1.push_back(v);
        }
        for(int j=0;j<N;j++){
            cin >> val;
            vec[arr1[j]]+=val;
        }
        for(int i=1;i<=M;i++){
            if((vec[arr1[i]])<min && (vec[arr1[i]])!=0){
                min = vec[arr1[i]];
            }
        }
        cout << " box: "<<endl;
        for(int a=0;a<vec.size();a++){
            cout << vec[a] << " ";
        }
        cout << endl;
        cout << min << endl;
        vec.clear();
        arr1.clear();
    }   
    return 0;
}

问题链接:https ://www.codechef.com/MARCH20B/problems/CHPINTU 。谁能告诉我为什么会这样?我该如何克服这个问题? 谢谢你。

标签: c++segmentation-faultruntime-error

解决方案


N 可能小于 M,在这种情况下,这可能会导致分段错误:

for(int i=1;i<=M;i++){
    if((vec[arr1[i]])<min && (vec[arr1[i]])!=0){
        min = vec[arr1[i]];
    }
}

您应该查看vec[i]而不是vec[arr1[i]]

Nit:这仍然会给你 WA(Wrong Answer) 但不会导致 SIGSEGV,我能找到的错误之一只是在开始时初始化min,而不是在循环中用 INT_MAX 初始化它T


推荐阅读