c++ - 在函数之间的堆上传递数组时导致此运行时错误的原因,c++

标签 c++ pointers multidimensional-array heap-memory

当我在接受双指针的函数之间传递在堆上声明的二维数组时,我无法解释为什么我的程序会挂起和崩溃。

我有一种强烈的感觉,它与我选择的声明二维数组的方法有关。在我创建一个函数来分配数组之前,程序可以在传递给函数时操作数组中的数据。

所以这是分配函数,然后是它在内部崩溃的函数:

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/

相关文章:

模板中的 C++ 静态常量初始化顺序

c++ - MySQL Workbench 无法启动

c++ - 如何使用指针和指针运算

c++ - 从静态函数调用非静态变量

c - 如何在 C 中查找动态二维字符数组中的行数?

c++ - FORTRAN 中的 POINTER 关键字相当于 C/C++ 中的 POINTER 关键字

c++ - 如何在 C++ 中动态分配连续的二维数组?

objective-c - 分配对象指针

java - 这些代码块之间有什么区别?

c# - 转换二维数组