返回对字符串数组的引用

时间:2013-10-09 13:05:34

标签: c++ c++11

我目前正在通过C ++ Primer Fifth Edition。我已经阅读了其他一些C ++书籍,但它们并不是很详细,而且非常复杂。

这本书一直帮助我很多我错过的东西。我刚碰到了一堵墙。

其中一个练习要求我为函数编写声明,该函数返回对十个字符串数组的引用,而不使用尾随return,decltype或type别名。

我知道它只是写了一个声明,我已经这样做了,如下:

string (&returnArray()) [10];

我也想编写一个函数定义,如下所示:

string (&returnString(int i, string s)) [10]
{
    string s1[10];

    s1[i] = s;

    return s1;
}

在我的main函数中,我有一个for循环,它传递一个字符串文字并将该字符串存储在一个指向十个字符串数组的指针中。然后它应该将结果输出到屏幕。

我遇到的问题是,当我取消引用指向数组的指针时,它会输出一次地址。如果我取消引用它两次,程序就不输出任何内容并停止响应。

这是我的主要功能,我已多次更改,但无法弄清楚为什么输出不正确。我可能错了......

int main()
{
    string (*s)[10];

    for(int i = 0; i != 10; ++i)
    {
            s = &returnString(i, "Hello");

            cout << s[i] << endl;
    }

    return 0;
}

3 个答案:

答案 0 :(得分:3)

您的函数返回对局部变量的引用 - 在调用之后,它是悬空引用。你不能这样做。

您只能返回在函数调用结束后继续存在的存储引用。

答案 1 :(得分:2)

返回对临时本地对象的引用会调用未定义的行为。

简短的解决方法是static

string (&returnString(int i, string s)) [10]
{
    static string s1[10];
    ^^^^^^

    s1[i] = s;

    return s1;
}

int main()
{
    string(&s)[10] = returnString(0, "Hello");

    for (int i = 0; i != 10; ++i)
    {
        s[i] = "Hello";
        cout << s[i] << endl;
    }
}

答案 2 :(得分:0)

返回指向本地变量的指针/引用是错误的,未定义的行为。你可以按照你的练习而不是忘记这个限制,你的练习告诉你做一些事情,但它并不一定告诉你以错误的方式去做,事实上它是一个很好的导致你陷入陷阱并因此使你成为一个更好的程序员一旦你搞清楚了。

那么剩下的就是没有将地址返回给局部变量但仍然处理给定的任务的约束?你已经提到了M {M}已经提到的static修正,或者你认为你正在创建像函数rotate这样有用的东西,例如,接受string(&)[10]并返回自身; - )

请注意,iostream插入和提取运算符已经像这样工作,返回对引用传递的参数的引用。