指向指針的指針的內(nèi)存分配方法

字號:

指向指針的指針變量
    一個指向指針的指針變量能夠保存另一個指針變量的地址??梢杂萌缦侣暶鳎?BR>    type **variable ;
    分配內(nèi)存
    可以把分配給指向指針的指針變量的內(nèi)存視為二維結(jié)構(gòu)。它有這相關(guān)的行和列。例如,對與大小為m*n的內(nèi)存,視為有m行,而每行又有這n列。因此,分配內(nèi)存時:
    1.首先為m行分配內(nèi)存
    2.對每一行再分配n列內(nèi)存
    例子:為一個指向浮點數(shù)的指針的指針分配內(nèi)存,假設有4行3列
    float **float_values ;
    //為行分配變量
    float_values=(float **)malloc(4*sizeof(float *));
    //為每行的列非陪內(nèi)存
    for(int i =0 ;i<4 ;i++)
    {
    *(float_values+i)=(float*)malloc(3*sizeof(float));
    }
    賦值
    有兩種方法訪問二維的內(nèi)存地址:
    1.用[]操作符,類似與訪問二維數(shù)組:
    for(int i=0; i< 4 ;i++)
    for(int j=0 ;j<3 ;j++)
    {
    scanf(\"%f\",&val);
    float_values[i][j]=val;
    }
    2.指針操作符(*)
    for(int i=0; i< 4 ;i++)
    for(int j=0 ;j<3 ;j++)
    {
    scanf(\"%f\",&val);
    *((*float_values+i)+j)=val;
    }
    釋放內(nèi)存
    對于動態(tài)分配的內(nèi)存,我們需要將其釋放。釋放要從最底層開始,和分配是順序剛好相反。如果我們先釋放了高層的指針,這樣我們就會丟失底層的指針,從而無法釋放那些指針指向的內(nèi)存,造成內(nèi)存泄漏。正確的釋放內(nèi)存方法如下:
    //freeing up memoryallocated to second level pointers
    for(int i = 0; i<4; i++)
    {
    free(float_values[i]);
    }
    //freeing up memoryallocated to first level pointers
    free(float_values);