将2d int数组复制到C中的双指针

时间:2016-11-21 05:19:48

标签: c arrays

所以我有以下功能。该函数采用目标int **双指针并将源数组复制到它。

void copyMatrix(int ** target, int m, int n, int source[m][n])
{
  int i,j;

  target = (int **) malloc(m * sizeof(int *));
  for (i = 0; i < m; i++)
    target[i] = (int *)malloc(n * sizeof(int));

  for(i=0; i < m; i++){
    for(j=0; j < n; j++){
     target[i][j] = source[i][j];
    }
  }
  printf("%d ", target[i][j]);
}

当我在for循环后调用printf时,我得到一个段错误,但如果我在for循环中调用printf,它会正确打印target [i] [j]。为什么是这样?我正在把头发撕掉......

2 个答案:

答案 0 :(得分:1)

循环后,i == mj == n。他们都指出1项超过最大值。 C中的数组是零索引的,因此访问大小为target[n][m]的数组的[n][m]将提供越界访问。

答案 1 :(得分:0)

我不清楚你为什么要先创建一个指针数组。使用这种方法,您最终会遇到修改双指针本身的问题,而这不会反映在调用者中。您可以直接分配一个数组来存储输入的2D数组。

您的代码:

void copyMatrix(int ** target, int m, int n, int source[m][n])
{
  int i,j;

  target = (int **) malloc(m * sizeof(int *));
  for (i = 0; i < m; i++)
    target[i] = (int *)malloc(n * sizeof(int));

  for(i=0; i < m; i++){
    for(j=0; j < n; j++){
     target[i][j] = source[i][j];
    }
  }
  printf("%d ", target[i][j]);
}

修改后的代码:

void copyMatrix(int ** target, int m, int n, int source[m][n])
{
  int i,j;

  *target = (int *) malloc(sizeof(int) * (m * n));


  for(i=0; i < m; i++){
    for(j=0; j < n; j++){
     (*target)[i][j] = source[i][j];
    }
  }
  printf("%d ", (*target)[i][j]);
}
相关问题