在c++中正确定义和返回函数中的数组
Correctly defining and returning arrays from functions in C++
如果我有以下程序:
#include <iostream>
// being lazy and using all std just for example.
using namespace std;
int (*some_func())[10]
{
int arr[10]= {0,1,2,3,4,5,6,7,8,9};
return arr;
}
int main()
{
int arr2[10] = some_func();
for(auto i : arr2)
cout << i << endl;
return 0;
}
这是定义返回数组的函数的正确方法吗?我知道我遗漏了一些重要的东西,我的知识告诉我,当你返回arr时,你得到了arr的第一个元素的a *,但它也告诉我,arr是局部定义的意思是,当函数结束时,arr将是未定义的因此,当我从返回值中将arr赋值给arr2时,我给它分配了未定义的内存这不是我想要的,但如果我返回&arr,那本质上不是一样的吗?
任何帮助理解这与上面的例子将是有用的,这似乎是我混淆了自己的某个地方,但我不太确定如何纠正它。
谢谢,
Euden
在c++ 11中应该使用容器std::array
#include <iostream>
#include <array>
std::array<int, 10> get_array()
{
return {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
}
int main()
{
auto arr = get_array();
for(const auto& elem: arr)
std::cout << elem << std::endl;
}
为什么更可取?
在c++中你不能返回数组,你可以返回指向第一个元素的指针。看看下面的代码:
int* array() { // int arr[10]; // <-- DO NOT USE IT! int* arr = new int[10]; // Better, but still ugly return arr; } int main() { auto arr = array(); }
但是内存呢?您应该在使用array之后删除它,但是您可以忘记它。所以,你需要一个智能指针。
std::unique_ptr<int[]> array() { std::unique_ptr<int[]> arr(new int[10]); return arr; }
注意:两种实现都使用动态分配的数组,而
std::array
封装静态数组。你不能像其他对象一样复制或分配数组,你需要迭代一个数组并将数据复制到另一个数组。
std::array
容器可以让您忘记它。int main() { std::array<int, 10> arr1{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}}; std::array<int, 10> arr2; arr2 = arr1; arr1.at(4) = 42; // arr1: {1, 2, 3, 4, 42, 6, 7, 8, 9, 10} // arr2: {1, 2, 3, 4, 5, 6, 7, 8, 9, 10} }
std::array
像其他容器一样提供了许多有用的成员函数,例如-std::array::at(pos)
。int main() { std::array<int, 10> arr; arr.at(42) = 42; }
如果
pos >= arr.size()
.
相关文章:
- 为什么将值返回函数传递给重载=运算符对运算符函数有效,而对其他运算符无效
- 编译器警告:执行到达值返回函数的末尾而不返回值
- 接收和返回函数指针的函数指针的类型?
- 我的动态链接队列在同一输出流中调用时不正确地输出三个返回函数
- C++函数链返回函数
- 返回函数指针的函数的签名
- 由于值返回函数中的错误,程序无法编译.它说未声明的标识符
- 非常量引用返回函数在常量值返回函数上用作 r 值
- 如何在 C++ 中从 void 返回函数访问变量
- 返回函数中带有 2 个可选 ctor 的对象
- 如何在 c++ 中返回函数的结构向量
- 返回 C++ 函数中的引用
- 使用向量时,当返回函数更改时,无法看到输出
- 如何在递归中使用返回函数
- 返回函数模板的类型C++作为第二个模板参数
- 为什么静态指针返回函数中有一个"静态"键?
- 递归返回函数,在特殊情况下不返回
- 从类返回函数
- 从类成员函数返回函数指针
- 从返回函数中推断不存在的模板参数