天天看點

動态記憶體配置設定 malloc,free 函數分析

為什麼使用動态記憶體配置設定

C語言中的一切操作都是基于記憶體的。

變量和數組都是記憶體的别名,如何配置設定這些記憶體由編

譯器在編譯期間決定。

定義數組的時候必須指定數組長度。

而數組長度是在編譯期就必須決定的

但是實際中有需求:

程式運作的過程中,可能需要使用一些額外的記憶體空間。是以就需要采用動态記憶體配置設定。

malloc 和 free

malloc和free用于執行動态記憶體配置設定和釋放。

動态記憶體配置設定 malloc,free 函數分析

malloc所配置設定的是一塊連續的記憶體,以位元組為機關,并且不帶任何的類型資訊。malloc配置設定的空間是從系統預留的一整塊空間中申請得到的,這一整塊預留的空間就是堆。

free用于将動态記憶體歸還系統。

動态記憶體配置設定 malloc,free 函數分析

在malloc配置設定記憶體時,還要加上強制類型轉換。

malloc不會初始化配置設定的記憶體。

注意:

• malloc實際配置設定的記憶體可能會比請求的稍微多一點,但是不能依賴于編譯器的這個行為。

• 當請求的動态記憶體無法滿足時malloc傳回NULL。

• 當free的參數為NULL時,函數直接傳回。

calloc和realloc

calloc的參數代表所傳回記憶體的類型資訊,這是比malloc強大的地方。

calloc會将傳回的記憶體初始化為0。

realloc用于修改一個原先已經配置設定的記憶體塊大小

在使用realloc之後應該使用其傳回值

當pointer的第一個參數為NULL時,等價于malloc

realloc不會進行初始化。

動态記憶體配置設定 malloc,free 函數分析

舉例:

#include <stdio.h>
#include <malloc.h>

int main()
{
    int i = ;
    int* pI = (int*)malloc( * sizeof(int));
    short* pS = (short*)calloc(, sizeof(short));

    for(i=; i<; i++)
    {
        printf("pI[%d] = %d, pS[%d] = %d\n", i, pI[i], i, pS[i]);
    }

    pI = (int*)realloc(pI,  * sizeof(int));

    for(i=; i<; i++)
    {
        printf("pI[%d] = %d\n", i, pI[i]);
    }

    free(pI);
    free(pS);

    return ;
}

           

小結

動态記憶體配置設定是C語言中的強大功能。

程式能夠在需要的時候有機會使用更多的記憶體。

malloc單純的從系統中申請固定位元組大小的記憶體。

calloc能以類型大小為機關申請記憶體并初始化為0。

realloc用于重置記憶體大小。

malloc(0)和calloc(0,……)都不會傳回空指針。

繼續閱讀