【问题标题】:Copy 2d int array to double pointer in C将 2d int 数组复制到 C 中的双指针
【发布时间】:2016-11-21 05:19:47
【问题描述】:

所以我有以下功能。该函数接受一个目标 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]。为什么是这样?我正在为此撕毁我的头发......

【问题讨论】:

  • 您认为ij 的值在循环之外是多少?
  • 您需要将指针传递给您的**target,因此它变为***target。然后在分配时使用*target = ...。您当前正在尝试修改 (double) 指针本身,而不是它指向的值。
  • 尽管您可能应该避免拥有三重取消引用的值。你可以做一次作为练习。考虑在copyMatrix 函数之外分配target,或者将其返回(并且不要传递它)。由于您必须在当前编写的函数之外释放它,因此您最好让 copyMatrix 表现得像 malloc 和朋友一样。
  • 感谢大家的cmets。我想我在大约 30 秒内学到的关于指针的知识比以往任何时候都多

标签: c arrays


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    您的代码:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-22
      • 1970-01-01
      • 1970-01-01
      • 2016-12-02
      • 2011-05-08
      • 2013-02-12
      • 1970-01-01
      • 2021-04-12
      相关资源
      最近更新 更多