分段错误,不确定来源

Posted

技术标签:

【中文标题】分段错误,不确定来源【英文标题】:Segmentation fault, not sure of orgins 【发布时间】:2016-10-01 04:29:52 【问题描述】:

我正在尝试编写一个读取输入然后反转字符串的程序。 所以我可能会输入“racecars”,它应该将它反转为“sracecar”。我不确定为什么会出现分段错误。我的调试器也不清楚我的段错误在哪里。我在 vim 中使用 gdb 调试器。

我怎样才能让我的程序在翻转功能中反向输入。

#include<iostream>
#include<string>
#include<algorithm>
using namespace std;

 string turnaround(string &input);

int main()

  cout << "enter some string to reverso" << endl;
  string input;
  getline(cin,input);

  turnaround(input);
  //cout << "your input is " << input << endl;

  return 0;


string turnaround (string & input)

  input = string(input.rbegin(), input.rend());

【问题讨论】:

你的程序表现出未定义的行为,通过退出非空函数而不遇到return 语句。 turnaround 不返回任何东西!你是如何编译你的代码的? 由于turnaround()正在修改input,要么让它返回void,要么在末尾添加return input语句。无论哪种方式,这都将避免与函数“落下”相关的未定义行为。此外,打开编译器警告 - 如果配置得当,大多数编译器都会在非void 函数结束时发出警告。 FWIW,使用 g++(5.3,0 版)编译时程序运行良好,但使用 clang++(Apple LLVM 5.1 版)编译时会出现段错误。 【参考方案1】:

您在 turnarround 中创建的新反转字符串在您离开周转范围后将不再可用。所以你已经输入了引用不再存在的对象,这就是段错误的原因。

试试下面的方法:

 string turnaround(const string& input)
 
    return string(input.rbegin(),input.rend());
 

【讨论】:

这是不正确的,因为新字符串被复制分配给input。因此,它不会是一个悬空的参考。答案是省略 return 语句是未定义的行为。 ... 并澄清一下:引用不能被重新定位,因此分配不会使 input 引用另一个对象,它会为 input 引用的对象分配一个新值。

以上是关于分段错误,不确定来源的主要内容,如果未能解决你的问题,请参考以下文章

访问全局数组会导致分段错误

C 中 Trie 实现中的分段错误

滥用指针会产生分段错误。我仍然不确定如何纠正它

Boost 线程中的分段错误 tls_destructor

什么是分段错误?

分段错误:在 C++ 中弹出向量时出现 11