我似乎无法理解的sigsev错误(运行时)

时间:2017-07-19 07:15:52

标签: c++ runtime-error c++14

所以我在网上判断时提交了这段代码,而代码在我的系统上运行正常,它给了我在线评判相同输入的错误。

    GDB trace:
Reading symbols from solution...done.
[New LWP 4622]
Core was generated by `solution'.
Program terminated with signal SIGSEGV, Segmentation fault.
#0  std::_Vector_base<int, std::allocator<int> >::_Vector_impl::_Vector_impl (
    this=0x7ffe815275a0) at /usr/include/c++/7/bits/stl_vector.h:89
89      : _Tp_alloc_type(), _M_start(), _M_finish(), _M_end_of_storage()
#0  std::_Vector_base<int, std::allocator<int> >::_Vector_impl::_Vector_impl (
    this=0x7ffe815275a0) at /usr/include/c++/7/bits/stl_vector.h:89
#1  std::_Vector_base<int, std::allocator<int> >::_Vector_base (
    this=0x7ffe815275a0) at /usr/include/c++/7/bits/stl_vector.h:127
#2  std::vector<int, std::allocator<int> >::vector (this=0x7ffe815275a0)
    at /usr/include/c++/7/bits/stl_vector.h:263
#3  main () at solution.cc:8

由于比赛现场直播,我不确定是否要分享我的代码,但如果有人对这个错误有所了解,那将会非常有帮助。

请注意,错误是由Cpp 14上完全相同的输入引起的。

好的,所以我决定分享我的代码:

code

#include <bits/stdc++.h>
using namespace std;
int main(){
    int n;
    cin>>n;
    int a[n],b[n];
    int max=1000000;
    vector<int> c1[max+1],c2[max+1];
    for(int i=0;i<n;i++){
        cin>>a[i];
        c1[a[i]].push_back(a[i]);
    }
    for(int i=0;i<n;i++){
        cin>>b[i];
        c2[b[i]].push_back(b[i]);
    }
    for(int i=max;i>=1;i--){
        //cout<<i<<endl;
        int f1=0,f2=0;
        for(int j=i;j<=max;j+=i){
            if(c1[j].size()>0){
                f1=1;
                break;
            }
        }
        for(int j=i;j<=max;j+=i){
            if(c2[j].size()>0){
                f2=1;
                break;
            }
        }
        if(f1 && f2){
            int max1=0,max2=0;
            for(int j=i;j<=max;j+=i){
                if(c1[j].size()){
                    for(int k=0;k<c1[j].size();k++){
                        if(max1<c1[j][k])
                            max1=c1[j][k];
                    }
                }
            }
            for(int j=i;j<=max;j+=i){
                if(c2[j].size()){
                    for(int k=0;k<c2[j].size();k++){
                        if(max2<c2[j][k])
                            max2=c2[j][k];
                    }
                }
            }
            cout<<max1+max2;
            return 0;
        }
    }
}

由于这是低估的,我只是想知道为什么?我怎么能更好地问这个问题呢?

3 个答案:

答案 0 :(得分:0)

我怀疑你的筹码空间不足 - 坚持vector (可变长度数组是非标准数据。不要使用它们。)

更改声明应该足够了:

vector<int> a(n),b(n);
int max=1000000;
vector<vector<int>> c1(max+1), c2(max+1);

答案 1 :(得分:0)

如果要声明一个向量数组,我建议使用数组容器类。您唯一需要记住的是,max需要const才能实现此目的。

const int max = 1000000;
std::array<std::vector<int, max + 1> c1, c2;

我更喜欢这种解决方案而不是矢量的“经典”矢量,在任何情况下,数组的大小在编译时都是已知的,因为眼睛上的IMO更容易。

答案 2 :(得分:0)

堆栈跟踪将代码留在第8行,这样就是第一个看起来的位置:

vector<int> c1[max+1],c2[max+1];

鉴于max是1000000,您尝试在本地存储中创建两百万个和两个向量。它失败并不奇怪 - 大多数实现使用堆栈进行本地存储,具有合理的最大大小。您希望使用new或(更好)std::make_unique()创建这些内容。

至于#include <bits/stdc++.h>using namespace std; - 你真的想放弃那些在一起使用时特别有害的坏习惯。