如何释放需要从函数返回的双指针?

时间:2016-01-29 08:59:07

标签: c return free pointer-to-pointer

例如,这是一个名为fnx.c的函数文件的代码,其中func()将从main函数调用。在将双指针同时返回主函数的同时,我应该如何释放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;

}

3 个答案:

答案 0 :(得分:3)

  1. main()中,拨打CreatePointer()
  2. main()中,拨打func()
  3. func()之外,当您不再需要TempArray时,请致电DestroyPointer()
  4. 你的DestroyPointer()错了。你有内存泄漏。它应该是这样的:

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

答案 1 :(得分:1)

如果你想在从main函数调用之后使用这个点(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();   
}

希望它有所帮助!

答案 2 :(得分:0)

在释放TempArray之前,您应释放所有行。

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

}

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