将 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 收到内存违规警报并终止了行为不当的程序。发生这种情况时,程序会遇到分段错误。
这是我的全部代码:
#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 收到内存违规警报并终止了行为不当的程序。发生这种情况时,程序会遇到分段错误。