当我在接受双指针的函数之间传递在堆上声明的二维数组时,我无法解释为什么我的程序会挂起和崩溃。
我有一种强烈的感觉,它与我选择的声明二维数组的方法有关。在我创建一个函数来分配数组之前,程序可以在传递给函数时操作数组中的数据。
所以这是分配函数,然后是它在内部崩溃的函数:
void matrix_malloc(int **matrix, int m, int n);
void matrix_init(int **matrix, int m, int n);
int main(void)
{
int **matrix;
int m(3), n(2);
matrix_malloc(matrix, m, n);
matrix_init(matrix, m, n); // runtime error
}
void matrix_malloc(int **matrix, int m, int n)
{ // get heap memory
int i;
matrix = new int*[m];
for(i = 0; i < m; i++)
{
matrix[i] = new int[n];
}
}
void matrix_init(int **matrix, int m, int n)
{ // randomize matrix
int i, j;
for(i = 0; i < m; i++)
{
for(j = 0; j < n; j++)
{
matrix[i][j] = rand() % 10 + 1;
}
}
}
最佳答案
您必须通过引用传递您的矩阵指针。
void matrix_malloc(int **matrix, int m, int n)
这接受矩阵的拷贝。这意味着您在 matrix
上的 matrix_malloc
中所做的任何事情都不会影响 main
中的内容。
应该是
void matrix_malloc(int **& matrix, int m, int n)
^^^
但是我建议您使用 vector 而不是原始指针和分配。这样你就不需要担心分配和释放。
void matrix_malloc(vector<vector<int> >& matrix, int m, int n);
// You don't need this anymore.
// void matrix_init(int **matrix, int m, int n);
int main(void)
{
vector<vector<int> > matrix;
int m(3), n(2);
// matrix_malloc(matrix, m, n);
matrix_init(matrix, m, n);
}
void matrix_init(vector<vector<int> >& matrix, int m, int n)
{ // randomize matrix
int i, j;
for(i = 0; i < m; i++)
{
vector<int> row;
for(j = 0; j < n; j++)
{
row.push_back(rand() % 10 + 1);
// matrix[i][j] = rand() % 10 + 1;
}
matrix.push_back(row);
}
}
关于c++ - 在函数之间的堆上传递数组时导致此运行时错误的原因,c++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15894813/