返回对字符串数组的引用
Return Reference to An Array of Strings
我目前正在阅读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
插入和提取运算符已经这样工作,返回对引用传递的参数的引用。
- 关于引用数组位置的问题
- 使用指针交换而不引用数组C++
- 对于Boost.Propertytree,有没有办法使用JSON点表示法来引用数组元素?
- 如何在递归函数中调用引用数组?
- 动态指针引用数组由三元运算符返回值,但有异常
- 为什么没有 std::string 构造函数来引用数组
- 指针/引用数组
- 错误 C2234:引用数组是非法的
- 引用数组的方法
- 通过引用数组值进行交换
- 引用数组涉及的技术问题
- 引用数组的函数调用
- 从其他类中的类引用数组
- 如何使用变量名称引用数组位置
- 在 OpenGL 中呈现三角形结构引用数组
- 如何取消引用数组元素(C++)
- c++引用数组数组(指针到指针?)
- 指向指针的指针如何能够引用数组
- C++取消引用数组
- c++中引用数组中对象的共享指针