初始化未知大小的数组

时间:2010-10-30 18:52:11

标签: c++

是否可以使用返回可变大小数组的函数?我的计划是将返回数组的大小作为数组的第一个成员(因此ret_val [0] = ret_val中的成员数)。

然后问题就是将数组初始化为该函数的返回值。 int moves[] = target_function()不可能编译。

6 个答案:

答案 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>