【问题标题】:C++ function to return arrayC++函数返回数组
【发布时间】:2012-06-04 05:56:55
【问题描述】:

我需要我的函数返回一个数组,但它不像大多数搜索示例显示的那样将数组作为参数。

代码是这样的:

double  myfunction ()
{
    double arr[10];
    //assign values to the array
    return arr;
}

main()
{
    double arr2[10];
    arr2[10] = myfunction;
    //print arr2
}

当我使用指针来显示数组时,我得到了像“CCCCCC”这样的值......

【问题讨论】:

  • 数组不是这样工作的。使用std::arraystd::vector 会给你这样的行为,但要确保你知道原始数组是如何工作的。看到这个问题:stackoverflow.com/questions/4810664/how-do-i-use-arrays-in-c
  • 这甚至不应该编译,double[10] 不能隐式转换为 double,就像 double(*)() 不能隐式转换为 double - 边界访问顺便说一句)。请出示真实代码。

标签: c++ arrays return-value


【解决方案1】:

你不能这样做......数组是内存块,因此不能“返回”......你可以通过函数调用传递指向数组的指针,但你不能安全地返回指针指向数组内存块,除非这些数组被声明为static。否则会得到未定义的结果,因为数组占用的堆栈内存将在函数返回时被回收,返回的指向堆栈内存位置的指针将无效。使用返回的指针很可能会破坏堆栈,或者使您的程序崩溃。

在 C 中,您必须显式使用指向堆分配数组的指针以避免此问题,但在 C++ 中,对于固定大小的数组,最好使用 std::vectorstd::array。例如,std::vector 仍然使用堆内存来存储数组(而不是堆栈),但通过 RAII,堆内存由对象的生命周期安全地管理。因此,与 C 不同的是,您不必担心由于无法释放指向堆内存的函数返回的指针所指向的内存而导致内存泄漏。

【讨论】:

  • 是的,但正如我在回答中指出的那样,如果存在关于指针所有权的问题并且您未能在您“拥有”内存的指针上调用 delete到。
  • 我认为std::array 如果适用的话在这里会更好。它看起来像是一个固定大小的数组,而不是数百万个元素。
  • 当我写我之前的评论时,你的第二段不在那里。是的 - 存在所有权问题:智能指针同样适用于处理作为容器的特定问题,但容器更好地封装并且许多管理自己的调整大小,因此通常是更好的选择。
  • @TonyDelroy :对不起,我在过去几分钟内一直在更新答案......我没有想到std::shared_ptr,但是是的,这绝对是一种可能性。几乎所有进行指针生命周期管理的东西都可以正常工作,尽管正如您所指出的,容器会比仅使用指针更好。
  • std::shared_ptr 做数组吗?我认为不是因为这就是 std::vector 的用途。
【解决方案2】:

注意:main必须具有结果类型 int,符合 C 和 C++ 标准。

在任何可能的地方使用const 也是一个好主意,因为这会给代码添加约束,使代码更易于理解(更少考虑)。

最后,也是最重要的一点,使用标准库工具。

#include <array>
using namespace std;

typedef array<double, 10> MyArray;

MyArray myfunction ()
{
    MyArray arr;
    //assign values to the array
    return arr;
}

int main()
{
    MyArray const arr = myfunction();
    //print arr2
}

【讨论】:

    猜你喜欢
    • 2012-09-26
    • 2021-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-31
    • 2012-04-01
    • 1970-01-01
    相关资源
    最近更新 更多