在c++中正确定义和返回函数中的数组

Correctly defining and returning arrays from functions in C++

本文关键字:返回 函数 数组 定义 c++      更新时间:2023-10-16

如果我有以下程序:

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

为什么更可取?

  1. 在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封装静态数组。

  2. 你不能像其他对象一样复制或分配数组,你需要迭代一个数组并将数据复制到另一个数组。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}
    }
    
  3. std::array像其他容器一样提供了许多有用的成员函数,例如- std::array::at(pos)

    int main()
    {
        std::array<int, 10> arr;
        arr.at(42) = 42;
    }
    

    如果pos >= arr.size() .