二維指針——改變更態申請的空間大小

假如,我如今動態申請了一個10個字節大小的空間。ide

char* p = ( char* ) malloc ( sizeof ( char ) * 10 );

我申請了10個字節大小的空間,然而,我用不到這麼多空間,爲了節省空間,因此我須要釋放多餘的空間,也就是說,我須要改變更態申請的空間大小。假設我如今只須要用到其中的5個字節大小的空間,那麼意味着我須要釋放其中5個字節。也就是說,將原本的10個字節大小的空間,改成5個字節大小的空間。
那麼,如今,咱們來實這個改變更態申請空間大小的函數。首先,由於,咱們須要改變空間大小,因此,必然的,咱們要指定咱們咱們最初申請的空間大小,以及咱們想要改變的,新的空間大小。因爲,這是動態申請的空間,因此,咱們在實現函數時,須要一個指向這個動態申請空間的指針的指針。那麼也就是說,這個函數聲明是這樣的:函數

void reset ( char** p, int size, int new_size );

如今,咱們已經有了函數的聲明,那麼咱們如今就來實現它。因爲咱們是想要改變,這個原有的空間的大小,因此,很明顯,咱們須要一個新的指針去動態申請一個新的空間。代碼以下:指針

char* pt = NULL;
pt = ( char* ) malloc ( sizeof ( char ) * new_size );

從理論上講,咱們函數中的二維指針p已經指向了主函數中的一維指針,也就是說,在reset函數中咱們能夠直接code

*p = pt;

只惋惜,這樣作是錯的。由於很明顯,咱們尚未將本來空間中的值放入新申請的空間中,雖然空間確實該變了,可是本來空間中的值沒有放入新的空間中。因此,咱們如今要在函數中,完成數據的複製操做。那麼如今,咱們須要一個新的指針指向這個新開闢的空間,做用是讓它循環遍歷將值一個一個的放入進去。it

char* tmp = pt;

除此以外,咱們還需知道有幾個須要複製的數據。因此,還須要一個變量用以記錄數據個數。
完整代碼以下:class

void reset ( char** p, int size, int new_size ){

    char* pt  =  NULL;
    char* tmp = NULL;
    int len = 0;
    char* pp = *p;
    int i = 0;

    if ( p != NULL && new_size > 0 ){

        pt = ( char* ) malloc ( sizeof ( char ) * new_size );
        tmp = pt;

        len = ( size < new_size ) ? size: new_size;

        for ( i = 0; i < len; ++i )
            *tmp++ = *pp++;

            free ( *p );

            *p = pt;

    }

}
相關文章
相關標籤/搜索