【问题标题】:Reference string parameter causes Segmentation fault?引用字符串参数导致分段错误?
【发布时间】:2013-05-26 07:16:15
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

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

    void getInput(string &input, string prompt)
    

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

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

    【讨论】:

    • 傻了我...它曾经返回一个字符串,然后我将其更改为使用out参数并忘记更改返回值...谢谢,很难看到我自己的错误! :)
    • +1 表示警告建议。 (顺便说一句,“-W -Wall”有点“过时的风格”,现在最好使用“-Wall -Wextra”,我发现)
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:
       string getInput(string &input, string prompt)
       {
          cout << prompt;
          getline(cin, input);
       }  
      

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

      试试:

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

      【讨论】:

        猜你喜欢
        • 2020-03-20
        • 2017-08-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-25
        • 1970-01-01
        • 2019-09-25
        相关资源
        最近更新 更多