是否可以使用返回可变大小数组的函数?我的计划是将返回数组的大小作为数组的第一个成员(因此ret_val [0] = ret_val中的成员数)。
然后问题就是将数组初始化为该函数的返回值。 int moves[] = target_function()
不可能编译。
答案 0 :(得分:7)
每个人都在告诉你使用矢量,但没有人告诉你如何做到这一点。方法如下:
#include <vector>
std::vector<int> target_function(int size)
{
std::vector<int> v(size);
v[0] = size;
return v;
}
int main()
{
std::vector<int> moves = target_function( my_favorite_int );
}
答案 1 :(得分:2)
您可以返回指针而不是数组:
int* moves = target_function();
但是不要返回指向你在堆栈上创建的东西的指针,因为当函数返回时它将超出范围。您可以在堆上动态分配数组。
答案 2 :(得分:1)
我建议不要使用这样的黑客。有std :: vector可供您使用。如果你真的想这样做,这就是你想要的代码:
int *allocate(int size)
{
int *res = new int[size];
res[0] = size;
return res;
}
// Prints "Yes, it's 42":
int *myArray = allocate(42);
if (myArray[0] == 42)
std::cout << "Yes, it's 42!" << std::endl;
答案 3 :(得分:1)
通常你会使用指向动态分配数组的指针:
int* target_function() {
int result* = new int[123];
result[0] = 123;
return result;
}
int *moves = target_function();
std::cout << moves[0] << " moves" << std::endl;
话虽这么说,但通常使用像std::vector<int>
这样的标准库容器更实用,更不容易出错。在C ++中,这基本上总是比原始数组更好的选择。
答案 4 :(得分:0)
此类数组不能是自动变量。它必须是Mark所说的动态创建数组的指针。
答案 5 :(得分:0)
简短的回答是你无法返回数组。您可以返回指向动态分配的内存的指针:
int* moves = target_function();
// do stuff with moves
delete[] moves;
target_function()
必须使用new
来分配内存。
请注意,从内存管理的角度来看,这并不理想,因为很容易忘记在返回的数组上调用delete[]
。相反,请考虑返回std::vector<int>
。