0

在 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;
}

我做错了什么,参考参数是否使用不正确?

4

3 回答 3

7

该函数getInput被声明返回 astring但没有return未定义行为的语句。如果您像这样更改声明:

void getInput(string &input, string prompt)

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

warning: no return statement in function returning non-void [-Wreturn-type]
于 2013-05-30T16:02:03.587 回答
3

该函数getInput说它返回 a string,调用代码试图复制它。但是return你的getInput函数中没有。由于复制实际上未返回的返回值是未定义的行为,此时“任何事情”都可能发生 - 在这种情况下,结果似乎是段错误。

由于您input用作参考,因此无需返回字符串。只需将函数原型更改为void.

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

于 2013-05-30T16:04:25.727 回答
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);
 }
于 2013-05-30T16:03:18.817 回答