【问题标题】:Using free() on pointers of two dimensional array with multiple malloc()?在具有多个 malloc() 的二维数组的指针上使用 free()?
【发布时间】:2019-04-18 22:46:24
【问题描述】:

我有一个函数,它在一个返回指向数组的指针的函数中分配一个二维数组。创建数组需要一个指针数组,每个指针包含二维数组中一行的地址。

完成此数组后,如何在此函数之外正确释放这两个 malloc() 调用?

int** allocateMatrix(int rows, int cols)
{
    int* arr = malloc(rows*cols*sizeof(int));
    int** matrix = malloc(rows*sizeof(int*));
    int i;
    for(i=0; i<rows; i++)
    {
        matrix[i] = &(arr[i*cols]);
    }
    return matrix;
 }

函数是这样使用的:

int** 2d_arr = allocateMatrix(row,cols);

谢谢!

【问题讨论】:

    标签: c function pointers multidimensional-array free


    【解决方案1】:

    我建议你使用单个malloc()来分配整个内存区域,以便于作为单个指针进行管理。

    我相信您的函数的以下修改版本应该可以工作。

    int** allocateMatrix(int rows, int cols)
    {
        size_t  sMemSize = rows*sizeof(int*) + rows*cols*sizeof(int);
        int** matrix = malloc(sMemSize);
        int* arr = (int *) (matrix + rows);
        int i;
        for(i=0; i<rows; i++)
        {
            matrix[i] = &(arr[i*cols]);
        }
        return matrix;
     }
    

    那么你可以只做free(2d_arr); where int** 2d_arr = allocateMatrix (nRows, nCols);

    【讨论】:

      【解决方案2】:

      您只能将来自malloc 的内容传递给free。所以free的调用次数必须与malloc的调用次数相同。

      2d_arr 的第一行,即2d_arr[0],包含&amp;arr[0*cols] == &amp;arr[0] == arr。所以你想释放它和matrix 本身:

      free(2d_arr[0]);
      free(2d_arr);
      

      【讨论】:

      • 我这样做可以吗:free(2d_arr[0]);函数外
      • @TimWeissenfels 是的,由于2d_arr 包含与matrix 相同的值,所以效果是一样的。
      • 感谢您的快速回复!但我不明白的是为什么我只需要从矩阵中释放()第一个索引:)
      • @TimWeissenfels 你只能将传递给free 的内容传递给malloc。所以每人两个。
      • @TimWeissenfels 很高兴我能帮上忙。如果您觉得有用,请随时 accept this answer
      【解决方案3】:

      这将起作用:

      void freeMatrix( int **matrix )
      {
          free( matrix[ 0 ] );
          free( matrix );
      }
      

      因为,对于i == 0,这段代码

      matrix[i] = &(arr[i*cols]);
      

      matrix[ 0 ] 设置为arr[0] 的地址,这与第一个malloc 调用返回的值相同:

      int* arr = malloc(rows*cols*sizeof(int));
      

      这样写矩阵分配就更清楚了

      int** allocateMatrix(int rows, int cols)
      {
          int** matrix = malloc(rows*sizeof(int*));
          matrix[ 0 ] = malloc(rows*cols*sizeof(int));
      
          int i;
          for(i=1; i<rows; i++)
          {
                  matrix[i] = &(arr[i*cols]);
          }
          return matrix;
       }
      

      注意malloc() 顺序的变化、对matrix[ 0 ] 的直接分配以及从1 开始的循环索引的变化。

      【讨论】:

        猜你喜欢
        • 2011-02-19
        • 2012-10-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多