分段错误,不确定来源
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
引用的对象分配一个新值。
以上是关于分段错误,不确定来源的主要内容,如果未能解决你的问题,请参考以下文章