如何使用int ** ptr释放二维数组分配的内存

时间:2015-04-29 17:21:30

标签: c arrays memory free pointers

如何使用int ** ptr?

使用函数分配的内存释放二维数组

例如,我使用allocArray( &ptrArray, row, column);来分配数组。 使用此函数释放已分配内存的正确步骤是什么: void freeArray( int *** pA, int row, int column)

#include <stdio.h>
#include <stdlib.h>

void allocArray( int *** pA, int row, int column)
{
    int i, j, count;

    *pA = (int **) malloc(row * sizeof(int *));
    for (int i =0; i<row; ++i)
    {
        (*pA)[i] = (int *) malloc( column * sizeof(int));
    }
    // Note that pA[i][j] is same as *(*(pA+i)+j)
    count = 0;
    for (i = 0; i <  row ; i++)
        for (j = 0; j < column; j++)
            (*pA)[i][j] = ++count;  // OR *(*(pA+i)+j) = ++count

    for (i = 0; i <  row; i++)  {
        for (j = 0; j < column; j++)  {
            printf("%d ", (*pA)[i][j]);
        }
        printf("\n");
    }
}

// How to free a two dimensional array  allocated memory using int ** ptr?
void freeArray( int *** pA, int row, int column)
{

}

void test_array_allocation()
{
    int i, j;
    int row = 3, column = 4;
    int ** ptrArray;

    allocArray( &ptrArray, row, column);

    printf("test_array_allocation\n");
    for (i = 0; i <  row; i++)  {
        for (j = 0; j < column; j++)  {
            printf("%d ", (ptrArray)[i][j]);
        }
        printf("\n");
    }
    freeArray(&ptrArray, row, column); // free allocated memory  
}

int main(int argc, const char * argv[]) {
    test_array_allocation();  
    return 0;
}

2 个答案:

答案 0 :(得分:1)

对于malloc的每次通话,都必须对free进行相应的通话。对free的调用必须使用相应调用malloc返回的相同指针值。

在您的情况下,您有以下使用malloc分配内存的行。

*pA = (int **) malloc(row * sizeof(int *));
for (int i =0; i<row; ++i)
{
    (*pA)[i] = (int *) malloc( column * sizeof(int));
}

使用row中存储的值,free的来电次数必须(*pA)次。

然后,必须使用free*pA进行一次调用。

现在,您可以将freeArray实现为:

// No need for using int ***. You are not going to modify pA
// You are just going to use the pointer.
// You don't need column in this function.

void freeArray( int ** pA, int row)
{
    for (int i =0; i<row; ++i)
    {
        free(pA[i]);
    }
    free(pA);
}

使用以下内容从test_array_allocation调用

freeArray(pA, row);

答案 1 :(得分:0)

这个功能:

void freeArray( int *** pA, int row, int column)
{

}

参数&#39;列&#39;不需要。

void freeArray( int **pA, int row )
{
    for( int i = 0; i < row; i++ )
    {
        free( pA[i] );
    }
    free( pA );
}