C語言中的動態內存分配

爲什麼使用動態內存分配?
C語言中的一切操作都是基於內存的
變量和數組都是內存的別名,如何分配這些內存由編譯器在編譯期間決定
定義數組的時候必須指定數組長度
而數組長度是在編譯期就必須決定的
需求:
程序運行的過程中,可能需要使用一些額外的內存空間。

malloc和free

malloc和free用於執行動態內存分配和釋放
在這裏插入圖片描述
malloc所分配的是一塊連續的內存,以字節爲單位,並且不帶任何的類型信息
free用於將動態內存歸還系統

void* malloc(size_t size);
void free(void* pointer);

注意:
• malloc實際分配的內存可能會比請求的稍微多一點,但是不能依賴於編譯器的這個行爲
• 當請求的動態內存無法滿足時malloc返回NULL
• 當free的參數爲NULL時,函數直接返回

calloc和realloc

你認識malloc的兄弟嗎?

void* calloc(size_t num, size_t size);
void* realloc(void* pointer, size_t new_size);

calloc的參數代表所返回內存的類型信息
calloc會將返回的內存初始化爲0
realloc用於修改一個原先已經分配的內存塊大小
在使用realloc之後應該使用其返回值
當pointer的第一個參數爲NULL時,等價於malloc

看看他們的具體使用吧:

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

int main()
{
    int i = 0;
    int* pI = (int*)malloc(5 * sizeof(int));
    short* pS = (short*)calloc(5, sizeof(short));
    
    for(i=0; i<5; i++)
    {
        printf("pI[%d] = %d, pS[%d] = %d\n", i, pI[i], i, pS[i]);   //打印出申請內存裏的內容,看看有何不同
    }
    
    pI = (int*)realloc(pI, 10 * sizeof(int));     //修改已經分配內存塊大小
    
    for(i=0; i<10; i++)
    {
        printf("pI[%d] = %d\n", i, pI[i]);
    }
    
    free(pI);
    free(pS);
    
    return 0;
}

在這裏插入圖片描述
這是在Windows下運行情況,可以看出malloc申請分配的內存裏沒有初始化,而calloc申請分配的內存都初始化爲0了。

小結

動態內存分配是C語言中的強大功能
程序能夠在需要的時候有機會使用更多的內存
malloc單純的從系統中申請固定字節大小的內存
calloc能以類型大小爲單位申請內存並初始化爲0
realloc用於重置內存大小

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章