在这个例子中,我想要返回int nums[40]
我该怎么做?
<RETURNTYPE> test()
{
int nums[40];
for (int i=0; i < 40; i++)
{
nums[i] = i + 1;
}
return nums;
}
答案 0 :(得分:5)
你不能这样做。由于多种原因(包括历史记录和C兼容性,以及在几个重要情况下将数组衰减到指针的规则),您无法返回原始数组;但是你可以返回包含该数组的struct
(或class
....)。
你在C ++ 11中可以做的是返回std::array<int,40>
;它表现得像你的东西,但它是一个合适的类(你想象的所有常用操作,以及迭代器的东西)。所以你的代码变成了:
std::array<int,40> test(void) {
std::array<int,40> nums;
for (int i=0; i < 40; i++) {
nums[i] = i + 1;
}
return nums;
}
optimizing compiler(例如g++ -Wall -O2 -std=c++11
....使用最近的GCC)将优化与您的假设返回类型完全相同(或类似FISOCPP's answer,这很可能编译成相同的目标代码)。
如果大小(40)在运行时可能会有所不同,请使用std::vector<int>
作为类型并声明std::vector> nums{40};
- 然后您可以nums.resize(17);
然后数据将保留在堆中(所以性能损失很小。)
答案 1 :(得分:2)
唯一的方法是将数组封装到一个结构(或者union - 这是不相关的)中。
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;
}
然后您可以通过'test()。ra'。
访问您返回的值答案 2 :(得分:0)
您需要动态分配内存(现在它在堆栈中)。返回类型将是int * then。