如何释放需要从函数返回的双指针?
How to free a double pointer that need to be returned from the function?
例如,这是一个名为 fnx.c
的函数文件的代码,其中 func()
将从主函数调用。我应该如何释放TempArray
,同时return指向主函数的双指针?
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;
}
- 在你的
main()
中调用 CreatePointer()
- 在你的
main()
中调用 func()
- 在
func()
之外,当您不再需要 TempArray
时,请致电 DestroyPointer()
而你的 DestroyPointer()
是错误的。你会有内存泄漏。它应该是这样的:
static void DestroyPointer (int row)
{
for (int r = 0; r < row; r++)
{
free(TempArray[r]);
}
free(TempArray);
}
您应该在释放 TempArray
之前释放所有行。
static void DestroyPointer (int row)
{
for (int r = 0; r < row; r++)
{
free(TempArray[r]);
}
free(TempArray);
TempArray = NULL;
}
但是你不应该在返回之前销毁指针,
因为在 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();
}
希望对您有所帮助!
例如,这是一个名为 fnx.c
的函数文件的代码,其中 func()
将从主函数调用。我应该如何释放TempArray
,同时return指向主函数的双指针?
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;
}
- 在你的
main()
中调用CreatePointer()
- 在你的
main()
中调用func()
- 在
func()
之外,当您不再需要TempArray
时,请致电DestroyPointer()
而你的 DestroyPointer()
是错误的。你会有内存泄漏。它应该是这样的:
static void DestroyPointer (int row)
{
for (int r = 0; r < row; r++)
{
free(TempArray[r]);
}
free(TempArray);
}
您应该在释放 TempArray
之前释放所有行。
static void DestroyPointer (int row)
{
for (int r = 0; r < row; r++)
{
free(TempArray[r]);
}
free(TempArray);
TempArray = NULL;
}
但是你不应该在返回之前销毁指针,
因为在 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();
}
希望对您有所帮助!