天天看點

指向指針的指針的記憶體配置設定與釋放

原文位址::http://hi.baidu.com/b_a_i_du/blog/item/7125a7d35ca0afd6a8ec9af6.html?

相關網帖

   1.給指向指針的指針配置設定和釋放記憶體  ----http://xingshi5216.blog.163.com/blog/static/4603159120086189321587/

   2.釋放使用指針的指針所配置設定到的空間----http://blog.sina.com.cn/s/blog_5fd9454d0100drfw.html

 本文來自http://www.codeproject.com/useritems/pointertopointer.asp一文,有感作者對指向指針的指針有着清晰和形象的解釋,特将其重要思想摘記下來。

      指向指針的指針變量

      一個指向指針的指針變量能夠儲存另一個指針變量的位址。可以用如下聲明:

      type **variable ;

     配置設定記憶體

      可以把配置設定給指向指針的指針變量的記憶體視為二維結構。它有這相關的行和列。例如,對與大小為m*n的記憶體,視為有m行,而每行又有這n列。是以,配置設定記憶體時:

     1.首先為m行配置設定記憶體

     2.對每一行再配置設定n列記憶體

     例子:為一個指向浮點數的指針的指針配置設定記憶體,假設有4行3列

       float **float_values ;

    //為行配置設定變量

     float_values=(float **)malloc(4*sizeof(float *));

   //為每行的列非陪記憶體             

      for(int i =0 ;i<4 ;i++)

    {

      *(float_values+i)=(float*)malloc(3*sizeof(float));

    }              

指向指針的指針的記憶體配置設定與釋放

   指派     

      有兩種方法通路二維的記憶體位址:

   1.用[]操作符,類似與通路二維數組:

   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;

}

     釋放記憶體

     對于動态配置設定的記憶體,我們需要将其釋放。釋放要從最底層開始,和配置設定是順序剛好相反。如果我們先釋放了高層的指針,這樣我們就會丢失底層的指針,進而無法釋放那些指針指向的記憶體,造成記憶體洩漏。正确的釋放記憶體方法如下:

      //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);

    from:http://read.newbooks.com.cn/info/165197.html

 //=================================================================

備注::

1.WINDOWS的程式在調試指針有沒被釋放,可以去看指針所指向的記憶體區域的内容是否被釋放了。

  在VC++ IDE下可以到調試視窗的MEMORY視窗去看指針指向的記憶體今天是什麼内容,有沒被釋放