参考字符串参数导致分段错误?

时间:2013-05-30 16:00:22

标签: c++ parameters reference parameter-passing pass-by-reference

在Code :: Blocks上使用GCC编译器,我收到一个错误:

Segmentation fault (core dumped)

Process returned 139 (0x8B)
...

输入输入后询问。 这是我的测试程序:

#include <iostream>
#include <string>

using namespace std;

string getInput(string &input, string prompt)
{
    cout << prompt;
    getline(cin, input);
}

int main()
{
    string input;
    getInput(input, "What's your name?\n>");
    cout << "Hello " << input << "!" << endl;
    return 0;
}

我做错了,参考参数使用不正确吗?

3 个答案:

答案 0 :(得分:7)

声明函数getInput返回string但没有return语句,这是未定义的行为。如果您更改声明如下:

void getInput(string &input, string prompt)

分段错误应该消失。打开警告可以帮助您找到此问题,使用gcc -W -Wall -pedantic我会收到您原始代码的以下警告:

warning: no return statement in function returning non-void [-Wreturn-type]

答案 1 :(得分:3)

函数getInput表示它返回string,调用代码尝试复制该return。但是getInput函数中没有input。因为复制一个实际上没有返回的返回值是未定义的行为&#34;任何&#34;可能会发生在这一点上 - 在这种情况下,似乎会出现段错误。

由于您使用void作为参考,因此无需返回字符串。只需将函数原型更改为{{1}}即可。

如果在编译时启用警告,您将更容易看到此类错误。

答案 2 :(得分:2)

 string getInput(string &input, string prompt)
 {
    cout << prompt;
    getline(cin, input);
 }  

您声明该函数返回string类型,但您在函数中没有return语句。当流程到达该函数的末尾时,它将导致未定义的行为。

尝试:

 void getInput(string &input, string prompt)
 {
    cout << prompt;
    getline(cin, input);
 }