【问题标题】:Returning 2d array from void function in C从C中的void函数返回二维数组
【发布时间】:2015-03-15 19:39:56
【问题描述】:

我有一个看起来像这样的函数:

void swapRows(int row_1, int row_2, double **matrix, int n, int m)
{
   double arrTemp = (double *)malloc(m * sizeof(double));
   int i;   

   for(i = 0; i < m; i++)
   {
      arrTemp[i] = matrix[row_1][i];
      *matrix[row_1][i] = matrix[row_2][i];
   }

   for(i = 0; i < m; i++)
   {
    *matrix[row_2][i] = arrTemp[i];
   }

}

我尝试使用两颗星和一颗星来取消引用数组,但无法弄清楚。我不想将它存储在另一个数组中并通过双重函数返回它,我需要从这个 void 函数返回它。我只是交换数组中的行,需要将修改后的数组返回给主函数。

【问题讨论】:

  • 除非我错过了这个函数的要点,否则它应该根本没有内存分配。您正在交换 rows,在这种情况下,这意味着只需交换指向两行的两个指针。不需要大容量内存复制。
  • @Kheldar 因为您的编辑原因:不,根本不会运行。
  • @deviantfan 我的观点是修改问题中的代码是一个坏主意,因为它将问题的答案转换为“另一种情况的答案”。如果您仍然觉得您的位置是正确的,请随时回滚^^
  • @Kheldar 是的,没关系,我也这么认为

标签: c arrays function 2d


【解决方案1】:

只要你只是改变数组中的值,你不需要做任何特别的事情。删除函数中的所有 * 并访问数组,就像您不想“返回”它一样。

void swapRows(int row_1, int row_2, double **matrix, int n, int m){
    double arrTemp = (double *)malloc(m * sizeof(double));
    int i;  
    for(i = 0; i < m; i++){
        arrTemp[i] = matrix[row_1][i];
        matrix[row_1][i] = matrix[row_2][i]; //no *
    }
    for(i = 0; i < m; i++){
        matrix[row_2][i] = arrTemp[i]; //no *
    }
}

不相关的问题,你在这里错过了这个 malloc 的免费。
而且,正如 WhozCraig 指出的那样,在 double **matrix 中,每一行都是单独分配的,您只需切换行指针即可。

void swapRows(int row_1, int row_2, double **matrix, int n, int m){
    double *tmp = matrix[row_1];
    matrix[row_1] = matrix[row_2];
    matrix[row_2] = tmp;
}

【讨论】:

  • 前者和后者的速度差异怎么强调都不为过。此外,即使是前者也可以在没有分配、单个临时 double 和一个循环的情况下完成,尽管我无法想象当后者是 O(1) 与 O(n) 时为什么有人会这样做。
猜你喜欢
  • 2021-03-29
  • 2021-12-04
  • 1970-01-01
  • 2021-05-01
  • 2014-12-19
  • 2011-07-09
  • 1970-01-01
相关资源
最近更新 更多