首页 > 解决方案 > 分段错误(核心转储)向量

问题描述

我试图编写简单的程序来获取用户的数字,然后对它们进行排序。我第一次使用向量并在终端中得到了这个“分段错误(核心转储)”。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;
}

标签: c++vector

解决方案


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


推荐阅读