将 cin 值放入数组时出现段错误

Segfault when puting cin value into array

这是我的全部代码:

#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;
    }

}

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

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

4 2
1 2
1 2
1 2
1 2

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

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]

您有一个数组索引越界错误,导致程序访问不应访问的数据。

for(int i = n-1; i >= 0; i++){

在上面的语句中,整数 i 循环直到溢出,从而将 c1 索引到内存的禁止区域。

OS 收到内存违规警报并终止了行为不当的程序。发生这种情况时,程序会遇到分段错误。