C 語言中的動態內存管理和動態內存分配是指在程序運行過程中,通過一些函數動態地管理和分配內存,以便更加靈活地使用系統資源。以下是 C 語言中的動態內存管理和動態內存分配原理:
一、動態內存管理
動態內存管理指的是在程序運行期間通過動態內存分配和釋放的方式來管理內存。常見的動態內存管理函數包括 malloc、calloc、realloc 和 free 等。
malloc 函數
malloc 函數用于在堆中分配指定大小的內存空間,返回一個指向該內存塊的指針。該函數原型為:
void* malloc(size_t size);
其中,size 參數表示要分配的內存空間大小,單位為字節。如果分配成功,返回的指針指向一段大小為 size 的連續內存塊;如果分配失敗,則返回 NULL。
calloc 函數
calloc 函數也用于在堆中分配指定大小的內存空間,與 malloc 函數不同的是,calloc 函數還會初始化所分配的內存空間,將每個字節都設置為 0。該函數原型為:
void* calloc(size_t num, size_t size);
其中,num 參數表示要分配的元素個數,size 參數表示每個元素的大小。如果分配成功,返回的指針指向一段大小為 num * size 的連續內存塊;如果分配失敗,則返回 NULL。
realloc 函數
realloc 函數用于改變先前通過 malloc 或 calloc 分配的內存空間大小。該函數原型為:
void* realloc(void* ptr, size_t size);
其中,ptr 參數表示要重新分配大小的內存空間的指針,size 參數表示需要重新分配的大小。如果重新分配成功,則返回指向新分配內存空間的指針;如果重新分配失敗,則返回 NULL。
free 函數
free 函數用于釋放先前通過 malloc、calloc 或 realloc 分配的內存空間。該函數原型為:
void free(void* ptr);
其中,ptr 參數表示要釋放的內存空間的指針。釋放成功后,該指針指向的內存空間會變為未定義狀態。
二、動態內存分配原理
動態內存分配采用的是在運行期間從系統中獲取一段連續的內存空間,并進行存取和釋放操作。在 C 語言中,通過調用 malloc、calloc、realloc 和 free 等內存管理函數實現動態內存分配。
當程序調用 malloc 函數分配內存時,操作系統內核會通過系統調用 brk 或 mmap 分配一段連續的虛擬內存空間。然后 malloc 函數會將這一段連續的虛擬內存映射為一塊連續的物理內存,用于存放分配出的內存空間。
當程序調用 free 函數釋放內存時,malloc 函數會根據待釋放內存塊的指針地址,訪問內存塊頭部,獲取該內存塊的大小信息,并將內存塊標記為可用狀態。如果相鄰的空閑內存塊存在,則進行內存合并,形成一個更大的空閑內存塊。
因此,動態內存分配的原理在于:通過調用操作系統的系統函數分配一段虛擬內存空間,用于存放分配出的內存空間。分配和釋放內存塊時,通過訪問內存塊頭部信息實現內存大小的管理,并通過內存合并操作來充分利用空閑內存塊提高內存利用率。