c++ - 分段错误(核心转储)向量
问题描述
我试图编写简单的程序来获取用户的数字,然后对它们进行排序。我第一次使用向量并在终端中得到了这个“分段错误(核心转储)”。smbd 可以帮我修复此代码吗?我认为带有 table.erase() 的函数 sortowanie() 存在问题,但我可能是错的。
#include <iostream>
#include <vector>
using namespace std;
vector <int> table;
vector <int> sorted;
void out(){
for( size_t i = 0; i < table.size(); i++ ){
cout << table[i] << ", ";
}
}
int y=table[0];
int z;
void sortowanie(){
for( size_t i = 0; i < table.size(); i++ ){
if(table[i]<y){
y=table[i];
z=i;
}
}
sorted.push_back(y);
table.erase(table.begin()+z);
if(table.size() == 0){
out();
}
else{
sortowanie();
}
}
void dodawanie(){
int x;
cin >> x;
table.push_back(x);
if(x == 0){
sortowanie();
}
else{
dodawanie();
}
}
int main()
{
cout << "podaj liczby z przedziału liczb naturalnych \n";
dodawanie();
return 0;
}
解决方案
table.erase(table.begin()+z);
绝对是问题所在,因为z
它并不总是由 iff 分配,z=i;
而是由 iff分配table[i]<y
。所以从 if 语句中取出赋值。否则你的z
增量会table.begin()
越界,这会导致 UB,从而导致你的崩溃。此外,如果向量为空,则不能删除 begin,因此将擦除放在if(table.begin()+z < table.end())
表达式中,这应该可以防止在所有情况下崩溃。并制作z
一个局部变量sortowanie
。
推荐阅读
- python - 使用 boto3 将本地文件夹同步到 s3 存储桶
- delphi - 读取 TextFile 类型的文件(使用 Readln 和/或 Read)是否有文件大小限制?
- django-cms - 如何在 djangocms 中添加 css 伪规则?我想实现悬停效果
- swift - 为什么 identifierForVendor 不返回唯一的 UUID
- angular - RXJS - 同时使用 take(1) 和 takeUntil()
- python-3.x - 如何将包含 String 和 Int 的子列表排序为字符串
- curl - curl命令从ansible Tower获取库存ID
- javascript - 迭代/循环对象或数组是否更快?
- c - for 循环在 C 中给出意想不到的结果
- vaadin - 如何在父 lit-element 组件中挂钩数据网格事件?