中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發布時間:2020-07-13 04:31:23 來源:網絡 閱讀:1668 作者:BarnabyRoss 欄目:編程語言

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

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函數中我們可以直接

*p = pt;

只可惜,這樣做是錯的。因為很明顯,我們還沒有將原本空間中的值放入新申請的空間中,雖然空間確實該變了,但是原本空間中的值沒有放入新的空間中。所以,我們現在要在函數中,完成數據的復制操作。那么現在,我們需要一個新的指針指向這個新開辟的空間,作用是讓它循環遍歷將值一個一個的放入進去。

char* tmp = pt;

除此之外,我們還需知道有幾個需要復制的數據。所以,還需要一個變量用以記錄數據個數。
完整代碼如下:

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;

    }

}
向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

濮阳县| 卢氏县| 奉新县| 朝阳区| 土默特右旗| 乌拉特前旗| 九台市| 青铜峡市| 通化市| 南岸区| 曲阳县| 革吉县| 南靖县| 武陟县| 专栏| 讷河市| 建瓯市| 白玉县| 临泽县| 富阳市| 大洼县| 玉林市| 宣汉县| 呈贡县| 东乡族自治县| 平和县| 高邮市| 五大连池市| 荆州市| 商都县| 富民县| 开封市| 彩票| 云浮市| 鸡泽县| 九寨沟县| 兴化市| 临湘市| 高台县| 太原市| 莱芜市|