【问题标题】:How can an declare an array in a function that returns an array in c++如何在 C++ 中返回数组的函数中声明数组
【发布时间】:2020-05-14 16:12:31
【问题描述】:

// 将数字转换为数组的函数

int *initialiser(int number)
{
    int array[20];

    for (int i = 19; i >= 0; i--)
    {
        array[i] = number % 10;
        number /= 10; // number = number/10
    }

    return array;
}

//我得到这个错误

primaryAddSub.cpp: In function 'int* initialiser(int)':
primaryAddSub.cpp:21:9: warning: address of local variable 'array' returned [-Wreturn-local-addr]
     int array[20];
         ^~~~~

我可以使用 static int array[20];但是每次调用该函数都会返回相同的结果。

【问题讨论】:

  • 请改用std::arraystd::vector
  • 谢谢,请问我该如何退货?
  • std::array<int, 20> initialiser(int number)
  • std::vector<int> initialiser(int number) { std::vector<int> array(20); ... } 其余的也可以。只有呼叫站点可能需要一些调整 - 取决于它现在的样子。
  • @user4581301 数组总是通过引用传递 WAT???数组衰减到一个指针,并且该指针按值传递。要通过引用传递数组,您需要明确地这样做,例如 void foo(int (&x)[100]);

标签: c++ arrays function declaration


【解决方案1】:

正如评论所说,更喜欢使用std::vector 而不是int*。其工作原理的一个示例是:

std::vector<int> initialiser(int number)
{
    std::vector<int> array;

    // ... fill up array

    return array;
}

如果你绝对想返回一个int*,那么正如错误所说,你正在返回一个指向局部变量的指针。您需要分配内存:

int *initialiser(int number)
{
    int *array = new int[20];

    // ... fill up array 

    return array;
}

别忘了delete 完成此记忆。此外,调用者确实无法知道数组中有 多少 个元素,因此它们可能会越界读取/写入。

一般来说这很容易出错,所以更喜欢第一个版本,这样您就不必担心删除任何内容,并且不太可能出现越界错误。

【讨论】:

  • 你是一个节省生命和时间的人,非常感谢......我花了几个小时,但我没有找到任何解决方案。再次感谢
  • 不用担心,很高兴为您提供帮助。请务必接受有关使用 vector 的建议,即使数组版本现在适合您。
猜你喜欢
  • 2014-12-08
  • 1970-01-01
  • 1970-01-01
  • 2021-12-29
  • 2010-11-30
  • 1970-01-01
  • 1970-01-01
  • 2016-03-05
相关资源
最近更新 更多