【问题标题】: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 版)编译时会出现段错误。

标签: c++ string function segmentation-fault


【解决方案1】:

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

试试下面的方法:

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

【讨论】:

  • 这是不正确的,因为新字符串被复制分配给input。因此,它不会是一个悬空的参考。答案是省略 return 语句是未定义的行为。
  • ... 并澄清一下:引用不能被重新定位,因此分配不会使 input 引用另一个对象,它会为 input 引用的对象分配一个新值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-02-13
  • 1970-01-01
  • 2014-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多