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

标签 c++ arrays function c++11 return

<分区>

如果我有以下程序:

#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 的第一个元素,但它也告诉我 arr 是在本地定义的,这意味着当函数完成时 arr 将是未定义的因此,当我实际从返回中将 arr 分配给 arr2 时,我正在为它分配未定义的内存,这不是我想要的,但是如果我返回 &arr 是不是本质上是一样的?

任何帮助理解与上述示例相关的内容都会很有用,看来我在某个地方感到困惑,但我不太确定如何纠正它。

谢谢,

尤登

最佳答案

在 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();
    }
    

    但是内存呢?你应该在使用后删除数组,但你可以忘记它。所以,你需要一个智能指针。

    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(),它会抛出一个异常。

关于c++ - 在 C++ 中正确定义和返回函数数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15997022/

相关文章:

c++ - CMake 嵌套项目和目标

c++ - C 和 C++ 中的优化关键字是否合理?

c++ - 创建 C++ 程序以运行 shell 脚本

c++ - 2个动态数组初始化之间的区别

c++ - Linux 内核中的 C func 签名 : include/linux/sched. h

c++ - 变量的 cstyle 转换返回的值是纯右值还是左值?

c - 在c中动态增加数组(int *)的大小

java - 如何使方法的数组可访问

javascript - 为什么当我调用有返回值的函数时,我的 onclick 事件不起作用?

c# - 函数的别名