使用类型转换在c ++中返回2D数组

时间:2012-12-17 15:49:00

标签: c++ arrays pointers multidimensional-array

int** function()
{
    int M[2][2] = {{1,2},{3,4}};
    return (int **)M;   //is this valid?
}

void anotherFn()
{
    int **p = new int*[2];
    for(int i = 0; i<2; i++) {
        p[i] = new int[2];
    }

    p = function();  
    cout << p[0][0]; 
}

上面编译的代码但是给出了运行时错误。那么,只有当它被声明为双指针时,我才能返回一个2D数组吗?或者是否有某种方法可以将数组作为2D指针返回?

2 个答案:

答案 0 :(得分:3)

您将2D数组表示为指向int的指针。这是个坏主意。更好的想法是使用std::vector<std::vector<int>>。更好的是使用专门的课程。但重点是,一旦你摆脱指针,你可以毫无问题地返回值:

matrix_2d function() {
    matrix_2d M = {{1, 2}, {3, 4}};
    return M;
}

这适用于matrix_2d的适当定义(见上文)。

Your code makes this whole process much more complicated by using pointers,并访问无效内存。特别是,您在主函数中分配内存,但是通过重新分配它的结果为function() 丢弃指向该内存的指针:inside function您没有使用先前分配的内存,您正在使用堆栈分配的内存并返回指向该内存的指针。函数退出后,堆栈分配的内存消失了。

答案 1 :(得分:2)

要返回2D数组,请确保动态分配它,然后返回指针。您的代码的问题是您返回一个指向局部变量的指针,这将导致问题。

基本上,你会想要做这样的事情(骨架):

int** function()
{
    int** M;
    // Allocate M here
    return M;
}