【问题标题】:Why is it necessary to define an array as a global variable when returning an array in a function? [duplicate]为什么在函数中返回数组时需要将数组定义为全局变量? [复制]
【发布时间】:2020-04-18 15:28:27
【问题描述】:

为什么在函数中返回数组时,需要将数组定义为全局变量?

int v[10] = { 1,2,3,44,55,66,77,8,9,1 };
auto fun()->int(*)[10]
{
    //int v[10] = { 1,2,3,44,55,66,77,8,9,1 };/
    return &v;
}

int main()
{
    auto t = fun();
    for (int i = 0; i <= 10; i++)
        cout << (*t)[i] << endl;
}

【问题讨论】:

  • 那不是有效的 C 代码。它看起来像 C++(过度使用 auto
  • 谁说有必要?这就是堆的用途。您不能像评论中显示的那样在堆栈上分配它。
  • for (int i = 0; i &lt;= 10; i++) 迭代 11 次。 int v[10] 有问题。
  • @UnholySheep:尾随返回类型在这里看起来实际上很合适,而不是丑陋的int (*func())[10] 语法。

标签: c++


【解决方案1】:

首先,您的代码是 C++ 而不是 C,所以我会做出相应的回应。

您可以返回 C++ 风格的 std::array,它是一个对象而不是 C 风格的数组,因此可以按值返回:

#include <iostream>
#include <array>
int v[10] = { 1,2,3,44,55,66,77,8,9,1 };
auto fun()->std::array<int, 10>
{
    std::array<int, 10> v;
    v[0] = 5;
    v[1] = 32;
    //int v[10] = { 1,2,3,44,55,66,77,8,9,1 };/
    return v;
}

int main()
{
    auto v = fun();
    for(size_t i = 0; i < 10; i++) {
        std::cout << v[i] << std::endl;
    }
}   

您可以改为动态分配数组,在这种情况下,您返回一个指针,调用者负责释放它:

auto fun2()->int*
{
    auto v = new int[10];
    v[0] = 1;
    // assign other elements
    return v;
}

int main()
{


    auto t2 = fun2();
    for (int i = 0; i < 10; i++)
        std::cout << t2[i] << std::endl;
    delete[] t2;
}   

您根本不允许在堆栈上分配数组然后返回它,因为一旦您的函数返回,堆栈变量的生命周期就结束了。话虽如此,这个例子是有效的,因为数组是在main 的堆栈帧中分配的,并且超过了它的所有用途:

void fillIn(int* ar, size_t len) {
    for (size_t i = 0; i < len; i++) {
        ar[i] = 32; // or whatever logic you want
    }
}
int main()
{
    int x[10];
    fillIn(x, 10);
    for (int i = 0; i < 10; i++) {
        std::cout << x[i] << std::endl;
    }
}

【讨论】:

  • “你可以动态分配数组,在这种情况下你返回一个指针”——为什么不直接按值返回数组呢? (作为std::array 甚至)。
  • @JesperJuhl 不清楚该操作是否希望使用 C++ 风格的 std::array 可以很容易地按值返回,但无论如何我现在都会写下来。除此之外,没有返回 C 样式数组的好方法(规范第 8.3.5/8 节)
猜你喜欢
  • 2013-01-09
  • 2015-10-04
  • 2017-07-06
  • 2015-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多