C如何从函数返回动态分配的数组

新手上路,请多包涵

我刚刚开始学习C++。我正在阅读互联网上的教程,现在我在函数中创建了一个动态分配的数组。

 void array_() {
    int size;
    cin >> size;

    int * Array = new int[size];

    for (int i = 0; i < size; ++i)
        cin >> Array[i];
}

如何将此函数返回给 main()

原文由 KonradDos 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.2k
2 个回答

在 C++ 中,您不能“按原样”从函数返回 数组 类型的变量(即 int arr[] ),尽管您可以返回指向 数组 的引用或指针。不过,这是一些相当笨拙的语法。在显示的代码中,没有 _数组_,而是指向一块动态分配的内存的指针。然而,主要问题是,由于内存是动态分配的,当您返回指向该内存的指针时,您只向客户端提供了一半的信息:数组的大小仍然未知。

因此,如果您真的想坚持使用动态分配的传统数组,您可以将数组的大小作为参考参数(“out-value”)传递给如下函数:

 int* func(std::size_t& size_out) {
    // int n = ...;
    int* array = new int[n];
    size_out = n;
    return array;
}

int main() {
    int size;
    int* result = func(size);
    delete[] result;
    result = nullptr;
}

如您所见,手动分配内存的副作用是客户端负责它,您必须 在分配它的函数之外 手动删除它。

但是“out-values”确实是一种糟糕的风格,尤其是在 API 中。尽可能避免它们!

当然最好使用适当的动态数组工具,例如 std::vector<T> ,但这似乎不是练习的重点。

使用的参考: 在函数中返回数组

原文由 iksemyonov 发布,翻译遵循 CC BY-SA 4.0 许可协议

好吧,返回大小和指针是明智的,否则将无法安全地使用结果数组。

所以我们正在寻找一种从函数返回两个值的方法。这可以通过采用参考参数来完成,您可以通过该参数分配值之一:

 int *array_(int &size) {
    std::cin >> size;

    int *Array = new int[size];

    for (int i = 0; i < size; ++i)
        std::cin >> Array[i];

    return Array;
}

int main() {
    int size;
    int *arr = array_(size);
    // ...
    delete[] arr; // Don't forget to delete[] what has been new[]'d!
}

或者,您可以返回一个 std::pair 包含两个值:

 std::pair<int *, int> array_() {
    int size;
    std::cin >> size;

    int * Array = new int[size];

    for (int i = 0; i < size; ++i)
        std::cin >> Array[i];

    return {Array, size};
}

int main() {
    auto arr = array_(size);
    // ...
    delete[] arr.second; // Don't forget still!
}

但这两个都是疯狂的坏主意,所以你现在可以开始编写 实际 的 C++,使它看起来不像变形的 C,使用标准容器:

 std::vector<int> array_() {
    int size = 0;
    std::cin >> size;

    std::vector<int> vec(size);

    for(int &i : vec)
        std::cin >> i;

    return vec;
}

int main() {
    auto arr = array_(size);
    // ...
    // Now you can forget delete: no raw owning pointer, no worries.
}

简单、防漏和异常安全(好吧,理想情况下你也会清理用户输入)。

原文由 Quentin 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题