分段故障(堆芯转储)矢量

Segmentation fault (core dumped) vectors

本文关键字:转储 矢量 故障 分段      更新时间:2023-10-16

我试图编写一个简单的程序,从用户那里获取数字,然后对它们进行排序。我第一次使用向量,在终端中得到了这个"分段故障(核心转储("。smbd能帮我修复这个代码吗?我认为函数sortowanie((和table.esers((有问题,但我可能错了。

#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并不总是由z=i;分配,而是仅当table[i]<y时分配。所以把赋值从if语句中去掉。否则,您的z将使table.begin()递增到界外,从而导致UB,从而导致崩溃。此外,如果矢量为空,则不能删除begin,因此请将擦除放在if(table.begin()+z < table.end())表达式中,这样可以在所有情况下防止崩溃。并使z成为sortowanie的局部变量。