为什么我使用 std::copy() 收到运行时错误(分段错误)?
Why do I receive Runtime Error(Segmentation fault) by using std::copy()?
我正在写一个家庭作业程序。
这是关于模拟两个人玩纸牌游戏。
起初,Y先生有n
张牌,而P先生有m
张牌,他们拥有的牌是独一无二的。
Y先生先玩,以下是你玩游戏的方式:
- 首先,你选择一个数字
x
,如果这个数字在你的竞争对手的牌中,你就拿走它。 - 然后,如果你已经有了你得到的卡,你把你手上的牌和你刚刚得到的牌都扔掉。
- 然后,你的竞争对手做同样的事情(他选择一个数字
w
(。
第一轮到此结束。
当其中一个人用完牌时,游戏结束。
此外,如果游戏没有在k
回合内结束,它会自动结束。
程序必须输出:
一个数字l
,表示游戏将在多少回合内结束。
Y先生和P先生在一轮结束时的牌。
我尝试使用矢量模拟游戏,但是当我尝试执行它时,代码会引发分割错误。
这是我的代码:
#include<bits/stdc++.h>
using namespace std;
int n,m,k,w,x,a;
vector<int> y,p;
vector<vector<int>> ymoves;
vector<vector<int>> pmoves;
int main(){
cin>>n>>m;
for(int i=0;i<n;i++){
cin>>a;
y.push_back(a);
}
for(int i=0;i<m;i++){
cin>>a;
y.push_back(a);
}
cin>>k;
bool b=1;
for(int i=0;i<k;i++){
cin>>x>>w;
for(int j=0;j<p.size();j++){
if(p[j]==x){
y.push_back(x);
p.erase(p.begin()+j);
break;
}
}
for(int j=0;j<y.size()-1;j++){
if(y[j]==x){
y.erase(y.begin()+j);
y.pop_back();
break;
}
}
for(int j=0;j<y.size();j++){
if(y[j]==w){
p.push_back(w);
y.erase(y.begin()+j);
break;
}
}
for(int j=0;j<p.size()-1;j++){
if(p[j]==w){
p.erase(p.begin()+j);
p.pop_back();
break;
}
}
copy(y.begin(),y.end(),ymoves[i].begin());
copy(p.begin(),p.end(),pmoves[i].begin());
if(y.empty()||p.empty()){
b=0;
cout<<i<<'n';
for(int j=0;j<i;j++){
cout<<ymoves[j].size()<<' ';
for(int l=0;l<ymoves[j].size();l++)cout<<ymoves[j].at(l)<<' ';
cout<<'n';
cout<<pmoves[j].size()<<' ';
for(int l=0;l<pmoves[j].size();l++)cout<<pmoves[j].at(l)<<' ';
cout<<'n';
}
break;
}
}
if(b){
cout<<k<<'n';
for(int j=0;j<k;j++){
cout<<ymoves[j].size()<<' ';
for(int l=0;l<ymoves[j].size();l++)cout<<ymoves[j].at(l)<<' ';
cout<<'n';
cout<<pmoves[j].size()<<' ';
for(int l=0;l<pmoves[j].size();l++)cout<<pmoves[j].at(l)<<' ';
cout<<'n';
}
}
}
一个会导致未定义行为的问题,并且可能随时导致分段错误:
copy(y.begin(), y.end(), ymoves[i].begin());
copy(p.begin(), p.end(), pmoves[i].begin());
ymoves
和pmoves
都初始化为0
大小。因此,执行ymoves[i]
/pmoves[i]
会导致越界访问,从而导致 UB。
当您全局定义ymoves
和pmoves
时(这在您的情况下没有多大意义,通常应该避免(,一旦您知道k
有多大,就需要使用 resize((:
cin>>k;
ymoves.resize(k);
pmoves.resize(k);
但这仍然会导致在您执行copy
点时出现未定义的行为。由于存储在pmoves
/ymoves
中的vecotr
也以0
的大小进行初始化,但是如果您使用copy
则必须确保目标足够大以容纳数据。
因此,您需要对以下各项进行resize
:
ymoves[i].resize(y.size());
pmoves[i].resize(p.size());
copy(y.begin(),y.end(),ymoves[i].begin());
copy(p.begin(),p.end(),pmoves[i].begin());
但我不确定在这里做copy
是否正确,我不知道覆盖现有值是否是您想要做的。
另外两个错误是:for(int j=0;j<p.size()-1;j++){
和for(int j=0;j<y.size()-1;j++){
,size()
返回一个有符号值,所以如果p.size()
0
你就会遇到问题,这正是代码中发生的情况。仅当p.size()
不为零时,才应执行这些循环。
但是由于变量的命名不是最佳的,因此很难确定该部分是否正确以及是否有更多部分存在问题。但这至少是导致UB的最明显原因。
- 删除指向指针的指针是运行时错误吗
- c++中的指针和运行时错误
- 无法理解此 return 语句的功能,没有它就会发生运行时错误
- 在同一模拟中使用静脉和静脉_ inet内容时出现运行时错误
- 对单向链表进行排序时出现运行时错误
- 为什么此代码存在运行时错误?
- 你能解释一下什么运行时错误是如何解决它的吗?
- 为什么会出现 gettnig 运行时错误:加载类型为"_Bit_type"(stl_bvector.h) 的空指针?
- 为什么程序在 c++ 中迭代 emtpy 向量时会抛出运行时错误
- 运行时错误:引用绑定到类型为"int"的空指针
- 为什么当 vector 为空时会显示运行时错误?
- C++运行时错误与快速排序算法抛出堆栈转储错误
- 运行时错误:矢量下标超出范围:正在检查空集
- 为什么我使用 std::copy() 收到运行时错误(分段错误)?
- 如何修复分段错误运行时错误
- C++ 中控制台代码运行时的分段错误
- 意外的运行时错误(分段错误)
- c++分段错误:为什么这个程序给出运行时错误(SIGSEGV)
- libusb 1.0程序以user身份运行时出现分段错误,而不是sudo身份
- C++代码编译,但在运行时出现分段错误。我想我正在篡改链表