0
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]; 
}

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

4

2 回答 2

3

您将二维数组表示为指向 int 的指针。这是个坏主意。一个更好的主意是使用std::vector<std::vector<int>>. 更好的是使用专门的课程。但关键是,一旦你摆脱了指针,你就可以毫无问题地返回值:

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

matrix_2d这对于(见上文)的适当定义非常有效。

您的代码通过使用指针使整个过程变得更加复杂,并访问了无效内存。特别是,您在 main 函数中分配内存,但随后您通过使用以下结果重新分配指向该内存的指针来丢弃它:在内部您没有使用先前分配的内存,您正在使用堆栈分配的内存和返回一个指向它的指针。一旦函数退出,堆栈分配的内存就消失了。function()function

于 2012-12-17T15:52:28.573 回答
2

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

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

int** function()
{
    int** M;
    // Allocate M here
    return M;
}
于 2012-12-17T15:49:58.057 回答