【问题标题】:Sort array using Recursion segmentation fault core dumped使用递归分段错误核心转储对数组进行排序
【发布时间】:2020-12-05 15:20:33
【问题描述】:

我最近一直在使用递归,并尝试使用相同的方法对数组进行排序,尽管使用递归来理解它。

我已经在这里声明了所有必要的功能

#include<iostream>
#include<stdlib.h>
#include<vector>

void insert(std::vector<int>&,int);
void sort(std::vector<int>&);
void getArray(std::vector<int>&, int, char **);
void display(const std::vector<int>&);

这是我的主要功能

int main(int argc, char **argv){
  std::vector<int> array;
  getArray(array,argc,argv);
  sort(array);
  display(array);

  return 0;
}

这是我的排序恢复函数。

void sort(std::vector<int>& array){
  if(array.size()==1)
    return;
  std::cout<<array.at(array.size()-1);
  int temp = array.at(array.size()-1);
  std::cout<<temp;
  array.pop_back();
  sort(array);
  insert(array,temp);
}

插入函数

void insert(std::vector<int>& array,int temp)
{
  if ((array.size()==0)||array.at(array.size()-1)<=temp)
    array.push_back(temp);
  int value = array.at(array.size()-1);
  array.pop_back();
  insert(array,temp);
  array.push_back(value);
}

输入数组函数

 void getArray(std::vector<int>& array, int argc, char **argv){
   for (int i = 1;i<argc;i++){
     array.push_back(atoi(argv[i]));
   }
 }

打印数组函数

  void display(const std::vector<int>& array){
    for (auto i : array){
      std::cout<<i<<std::endl;
     }
  }

基本上,我使用弹出数组的最后一个元素的逻辑进行递归排序,并使用插入和排序函数在排序结束后添加弹出的元素。

但是运行时出现分段错误

  $ g++ -std=c++14 -o main main.cpp
  $ ./main 0 7 2 5 1 9
  output : Segmentation fault (core dumped)

如果我输入

  $ ./main 5 
  output : 5

即对于单个输入,我返回基本情况,但对于数组则没有。

【问题讨论】:

  • 如果您在调试器中运行程序(例如,在 shell 中“gdb --args ./main 0 7 2 5 1 9”,然后在 gdb 中“运行”),您可以检查停止时的堆栈跟踪(gdb 中的“bt”)。这会告诉你问题出在哪里。

标签: c++ arrays sorting recursion c++14


【解决方案1】:

insert((array.size()==0)||array.at(array.size()-1)&lt;=temp) 为真时,你只需要array.push_back(temp) 而不要执行其余的函数,否则你会递归而没有结束并有堆栈溢出

例如:

void insert(std::vector<int>& array,int temp)
{
  if ((array.size()==0)||array.at(array.size()-1)<=temp) {
    array.push_back(temp);
  }
  else {
    int value = array.at(array.size()-1);

    array.pop_back();
    insert(array,temp);
    array.push_back(value);
  }
}

之后(去掉sort中的调试输出就看不到了,因为没有std::cout&lt;&lt;std::endl),编译执行:

pi@raspberrypi:/tmp $ g++ -Wall s.cc
pi@raspberrypi:/tmp $ ./a.out 0 7 2 5 1 9
0
1
2
5
7
9
pi@raspberrypi:/tmp $ 

除此之外

  • 不要使用 atoiatoi("aze") 会默默返回 0。
  • 您的排序方式非常昂贵(事实上std::sort 已经存在)
  • C++14 甚至 C++11 都没有特定的东西,编译的标签/方式是没用的

【讨论】: