返回对字符串数组的引用

Return Reference to An Array of Strings

本文关键字:引用 数组 字符串 返回      更新时间:2023-10-16

我目前正在阅读C++入门第五版。我看过其他几本C++书,但它们不是很详细,而且相当复杂。

这本书对我错过的一切帮助很大。我刚刚碰壁了。

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

我知道它只说写一个声明,我已经这样做了,就像这样:

string (&returnArray()) [10];

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

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

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

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

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

int main()
{
    string (*s)[10];
    for(int i = 0; i != 10; ++i)
    {
            s = &returnString(i, "Hello");
            cout << s[i] << endl;
    }
    return 0;
}

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

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

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

一个简短的修复是使其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;
    }
}

返回对局部变量的指针/引用是不好的、未定义的行为。你可以遵循你的练习,不要忘记这个约束,你的练习告诉你做某事,但它不一定告诉你以错误的方式去做,事实上,这是一个很好的练习,它会引导你进入陷阱,因此一旦你弄清楚了它们,就会让你成为一个更好的程序员。

那么,考虑到不将地址返回给局部变量但仍解决给定任务的约束,还剩下什么呢?您已经提到了 M M. 的static修复程序,或者您可能认为您正在创建一些有用的东西,例如一个函数rotate,例如,接受string(&)[10]并返回旋转的自身;-(

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