0

例如,这是一个名为 的函数文件的代码,fnx.c将从func()主函数调用该文件。我应该如何释放TempArray这里,同时将双指针返回到主函数?

    int * * TempArray; //global variable in this file

static void CreatePointer(int row, int col) {
    int r;
    TempArray = malloc(sizeof(int * ) * (row));
    for (r = 0; r < row; r++) {
        TempArray[r] = malloc(sizeof(int) * (col));
    }
}


static void DestroyPointer() {
    free(TempArray);
    TempArray = NULL;

}

int * * func(int * * OriArray, int row, int col, int r_offset, int c_offset) {
    int r, c;

    CreatePointer(row, col);

    for (r = 0; r < row; r++) {
        for (c = 0; c < col; c++) {
            TempArray[r][c] = OriArray[r + r_offset][c + c_offset];
        }
    }

    //destroy TempArray??

    return TempArray;

}
4

3 回答 3

3
  1. 在您的main(), 调用CreatePointer()
  2. 在您的main(), 调用func()
  3. 在外面func(),当你不再需要时TempArray,打电话DestroyPointer()

DestroyPointer()错了。你会有内存泄漏。它应该是这样的:

static void DestroyPointer (int row)
{
    for (int r = 0; r < row; r++)
    {
       free(TempArray[r]); 
    }
    free(TempArray);
}
于 2016-01-29T09:06:10.303 回答
1

如果你想在主函数调用后使用这个点(TempArray),你不能销毁它(TempArray)。只有当你不想使用这个点数据时,你才能销毁它。你可以这样测试:

main()   
{   
  int *p = func(oriArray,row,col,r_offset,c_offset);   

   for (int r = 0; r < row; r++){   
       for(int c = 0; c < col; c++){   
         printf("%d",p[r][c]);   
      }   
   }      

  DestroyPointer();   
}

希望能帮助到你 !

于 2016-01-29T09:53:48.397 回答
0

您应该在释放之前释放所有行TempArray

static void DestroyPointer (int row)
{
   for (int r = 0; r < row; r++)
   {
      free(TempArray[r]);
   }
   free(TempArray);
   TempArray = NULL;

}

但是您不应该在返回指针之前销毁它,
因为在此之后取消引用它main会导致未定义的行为。

于 2016-01-29T09:07:08.937 回答