C++ c++;函数的返回类型

C++ c++;函数的返回类型,c++,arrays,C++,Arrays,在本例中,我希望返回int nums[40] 我怎么做 <RETURNTYPE> test() { int nums[40]; for (int i=0; i < 40; i++) { nums[i] = i + 1; } return nums; } test() { int nums[40]; 对于(int i=0;i

在本例中,我希望返回
int nums[40]

我怎么做

<RETURNTYPE> test()
{
    int nums[40];

    for (int i=0; i < 40; i++)
    {
        nums[i] = i + 1;
    }

    return nums;
}
test()
{
int nums[40];
对于(int i=0;i<40;i++)
{
nums[i]=i+1;
}
返回nums;
}

您需要动态分配内存(它现在在堆栈上)。返回类型将是int*那么。

您不能这样做。由于一些原因(包括历史、C兼容性以及在一些重要情况下将数组衰减为指针的规则),您无法返回原始数组;但是您可以返回包含该数组的
结构
(或
…)

在C++11中可以做的是返回一个;它的行为与您的东西类似,但它是一个适当的类(包含您想象的所有常规操作,以及迭代器之类的东西)。因此,您的代码变成:

std::array<int,40> test(void) {
  std::array<int,40> nums;
  for (int i=0; i < 40; i++) {
    nums[i] = i + 1;
  }
  return nums;
}
std::数组测试(无效){
std::数组nums;
对于(int i=0;i<40;i++){
nums[i]=i+1;
}
返回nums;
}
一个(例如,
g++-Wall-O2-std=c++11
…使用一个最近的)将与您假设的返回类型(或类似的,可能被编译成相同的目标代码)完全相同地优化它

如果大小(40)在运行时可能不同,则使用
std::vector
作为类型并声明
std::vector>nums{40}-然后您可以
nums.resize(17)实现这一点的唯一方法是将数组封装到一个结构中(或联合,这与此无关)

typedef结构{int ra[20];}rvtyp;
rvtyp试验()
{
int nums[40];
对于(int i=0;i<40;i++)
{
nums[i]=i+1;
}
返回*(rvtyp*)和nums;
}

然后,您可以通过“test().ra”访问返回值。

另请参见:为什么不使用
std::vector
而不是数组?std::vector可以,但我希望在示例中使用
int[]
。您可以随时在需要时使用。Imho最佳实践是仅在需要时转换它,因此即使客户端代码需要一个
int[]
我也会在函数中使用一个向量。之后我必须释放吗?我的意思是它是堆还是堆?它是“斯蒂克”。每个变量大概都存储在那里(具体信息请参考ISO标准)。但是,您可以有一个指向非堆栈内存的指针(通常通过调用函数来提供)。在我们的例子中,我们没有返回指针,也没有调用外部函数,因此可以假设它是堆栈。因此,调用函数不需要外部工作。这不是真的-我正在将局部变量'nums'复制到返回值。就我所知,没有未定义的行为。我返回的是整个数组,而不是指向它的指针。如果你编辑你的答案,我将能够对它进行投票。我错误地否决了它!
typedef struct { int ra[20]; } rvtyp;

rvtyp test()
{
    int nums[40];

    for (int i=0; i < 40; i++)
    {
        nums[i] = i + 1;
    }

    return *(rvtyp*)&nums;
}