我可以将指针传递给指针,分配内存,然后将其传回去吗?

时间:2016-06-22 09:18:52

标签: c++ pointers

请考虑以下代码。这适用于分配单个数组,但是如果需要分配二维数组呢?你会怎么做呢?

#include <iostream>

void alloc(int **num)
{
    *num = new int[5];
    *num[0] = 5;
}

int main()
{
    int *num;
    alloc(&num);
    std::cout << num[0] << std::endl;
    delete [] num;
}

我的目标是将**char传递给函数并分配它。这可能吗?

2 个答案:

答案 0 :(得分:3)

  

如果需要分配二维数组怎么办?

     

我的目标是将** char传递给函数并将其分配。

那么,你想要的是指向指针数组的指针(每个都指向一个数组)?这与2D阵列不同,尽管为了简单起见通常也会这样对待。

就像你在分配单个数组时添加了一个额外的间接层一样,你可以添加一个间接层来分配一个指针数组,并指向整数数组。

所以,你可以写一个像void alloc(int ***num)这样的函数。是的,这是可能的,但不是很好的设计。

但是使用间接指针会使语法更复杂,并且存在用户将空指针传递给函数的风险。相反,更好的选择是使用引用:void alloc(int **&num)

由于函数会分配一些东西并“返回一个指针”,因此实际return指针更有意义:int** alloc()。更漂亮,不是吗?减少间接更好。

最后,问题是该功能的用户必须知道如何删除分配的内存。是使用new还是new[]分配的?甚至可能malloc?或者该函数是否返回指向静态对象的指针,该指针不得删除?除非单独记录,否则函数的调用者无法知道。

另外,如果其中一个分配失败怎么办?将会有一个例外,早期的分配将泄漏。

解决上述两个问题的C ++方法是使用RAII容器来管理内存。由于您显然希望拥有一个包含指向数组的指针的数组,因此标准库中有一个现成的解决方案:返回std::vector<std::vector<int>>。如果你想要一个正确的非锯齿状2D数组,即矩阵,那么你可能想为此编写一个自定义RAII容器,可能使用平面std::vector<int>来实现。请注意,第三方可能已经实施了此类容器。

答案 1 :(得分:0)

您的代码对我来说就像C一样。在C ++中,我(可能)使用自定义类型而不进行任何手动动态分配。例如

typedef std::vector<int> Row;
typedef std::vector<Row> Matrix;

Matrix initMatrix(int nRows,int nCols) {
    return Matrix(nRows,Row(nCols));
}

那么在这种情况下你甚至不需要一个函数,但你可以只调用构造函数(让array为你分配内存)。