首页 > 解决方案 > 将cin值放入数组时出现段错误

问题描述

这是我的所有代码:

#include <fstream>
#include <vector>
#include <algorithm>
#include <set>
#include <iostream>

using namespace std;

int main(){

    ifstream fin("cereal.in");
    ofstream fout("cereal.out");

    int n, m, f, s;
    cin >> n >> m;

    int c1[n];
    int c2[n];
    for(int i = 0; i < n; i++){
        cin >> c1[i] >> c2[i];
        c1[i]--;
        c2[i]--;
    }

    vector<int> fm(m, -1);
    set<int> fs;
    vector<int> ans;
    for(int i = n-1; i >= 0; i++){
        if(fs.find(c1[i]) == fs.end()){
            fs.insert(c1[i]);
        }else{
            if(fs.find(fm[c1[i]]) == fs.end()){
                fs.insert(fm[c1[i]]);
            }
        }
        fm[c1[i]] = c2[i];
        ans.push_back(fs.size());
    }

    for(int i = 0; i < n; i++){
        cout << ans[i] << endl;
    }

}

在第一个 for 循环 wheni = n-1中,我得到一个Segmentation fault: 11. 我在该 for 循环中的 cin 之后使用了 cout 调用来查找此信息。

这是什么原因?几分钟前它工作得很好,我什至没有接触这部分代码,它就停止了工作。我正在使用 VS Code,但即使我使用在线编译器,它也不起作用。这是我给出的输入:

4 2
1 2
1 2
1 2
1 2

请帮我。这不是我第一次遇到这样的问题。

标签: c++std

解决方案


for(int i = n-1; i >= 0; i++){ // <------
        if(fs.find(c1[i]) == fs.end()){
            fs.insert(c1[i]);
        }else{
            if(fs.find(fm[c1[i]]) == fs.end()){
                fs.insert(fm[c1[i]]);
            }
        }
        fm[c1[i]] = c2[i];
        ans.push_back(fs.size());
    }

更改为i--。您正在使用c1[i]超出范围的索引进行访问。


推荐阅读