天天看點

二維數組的動态記憶體配置設定

申請記憶體時,首先配置設定行,再配置設定列;

void malloc2dArray(int **pArr, int x, int y)
{
    int i;
    pArr = (int **)malloc(x * sizeof(int *));
    if(!pArr)
    {
        printf("動态申請記憶體失敗!\n");
        return NULL;
    }
    
    for(i = 0; i < x; i ++)
    {
        pArr[i] = (int *)malloc(y * sizeof(int));
        if(!pArr[i])
        {
            printf("動态申請記憶體失敗!\n");
            return NULL;
        }
    }
}
           

釋放記憶體時,首先釋放列,再釋放行;

void free2dArray(int **pArr, int x, int y)
{
    int i;
    for(i = 0; i < x; i ++)
    {
        free(pArr[i]);
        pArr[i] = NULL;
    }
    free(pArr);
    pArr = NULL;
} 
           

但這樣做的有個問題是,配置設定記憶體是不連續的,當對整塊記憶體操作時會出現問題。

下面的代碼配置設定的記憶體是連續的

void malloc2dArray2(int **pArr, int x, int y)
{
    int i;
    pArr = (int **)malloc(x * sizeof(int *));
    if(!pArr)
    {
        printf("動态申請記憶體失敗!\n");
        return NULL;
    }
    
    pArr[0] = (int *)malloc(x * y * sizeof(int));
    if(!pArr[0])
    {
        printf("動态申請記憶體失敗!\n");
        free(pArr);
        return NULL;
    }
    
    for(i = 0; i < x; i ++)
        pArr[i] = pArr[i-1] + y; // 索引與對應的資料位址關聯
    
    memset(p[0], 0, nHeight * nWidth);//二維數組清零
}

void free2dArray2(int **pArr, int x, int y)
{

    free(pArr[0]);
    pArr[0] = NULL;
    
    free(pArr);
    pArr = NULL;
} 
           

參考資料  http://03071344.lofter.com/post/10871e_34cade

繼續閱讀