如何理解和修复此代码中的分段错误

How to understand and fix the Segmentation fault in this code?

本文关键字:分段 错误 代码 何理解      更新时间:2023-10-16

我是一个新手,正在做C++Primer第五版的练习,它是:

练习6.33:编写一个递归函数来打印向量的内容。

我的代码,如下所示,编译时既没有错误也没有警告。函数vector_print()在将第一项添加到矢量中之后正常打印矢量。但在添加了第二项之后,该程序被操作系统终止。

我试着调试。在执行语句CCD_ 2时生成一个分段错误。结果是:

由于接收到来自操作系统的信号,下位机停止运行。

信号名称:sigsegov信号含义:分段故障

我读了一些关于这个错误的文章,但仍然没有得到它。有人能告诉我如何理解它并解决这个问题吗?:

#include <iostream>
#include <string>
#include <vector>
using namespace std;
template<class T>
void  vector_print(const vector<T> &_v);
int main()
{
    string s;
    vector<string> v;
    cout<<"Please Enter:n";
    while(cin>>s)
    {
        v.push_back(s);
        cout <<"the vector is:  --";
        vector_print(v);
    }
}
template<class T>
void vector_print(const vector<T> &_v)
{
    static typename vector<T>::const_iterator it = _v.begin();
    cout << *it <<" ";
    ++it;
    if(it != _v.end())
    {
        vector_print(_v);
    }
}

有一些问题,但主要问题是这一行:

static typename vector<T>::const_iterator it = _v.begin();
^^^^^^

由于CCD_ 3是静态,它将只初始化一次,并且对CCD_ 4的所有先前修改将在后续调用CCD_。

如果矢量从未被修改,则it将已经位于,因此在对vector_print的后续调用中,此行:

cout << *it <<" ";

将取消引用结束。如果你修改了你的向量,那么调用push_back可能会使it无效,链接的引用说:

如果新的size()大于capacity(),则所有迭代器和引用(包括过去的结束迭代器)都将无效。否则,只有过去的结束迭代器无效。

如果迭代器不是end,则不应在不首先检查的情况下递增迭代程序

这是解决问题的一种更简单的方法:

template <typename Iterator>
void printVector( Iterator first, Iterator last)
{
    if( first != last )
    {
        std::cout << *first << " " ;
        printVector( std::next( first ), last ) ;
    }
}

您可以从main调用函数,如下所示:

printVector( v.begin(), v.end() ) ;

您在不首先检查迭代器是否等效于_v.end的情况下递增迭代器。递增与end等效的迭代器是非法的。此外,vector_print循环不断。

#include <iostream>
#include <vector>
using std::cout;
using std::endl;
using std::vector;
void print_vector(vector<int>::iterator i, vector<int>::iterator j)
{
  if (i != j)
  {
    cout << *i++ << " ";
    print_vector(i, j);
  }
  else
  {
    cout << endl;
  }
}
int main()
{
  vector<int> v = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
  print_vector(v.begin(), v.end());
  return 0;
}