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指针返回?
答案 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;
}