深入了解C語言中的動態(tài)內(nèi)存分配
今天我們來學(xué)習(xí)一下C語言中的動態(tài)內(nèi)存分配 開始學(xué)習(xí)吧
什么是動態(tài)內(nèi)存分配
我們目前已經(jīng)知道的內(nèi)存開辟的方式有:
int val = 20;//在棧上開辟四個字節(jié)。 char arr[10] = { 0 };//在棧上開辟十個字節(jié)的連續(xù)空間
但是上述空間的開辟方式有兩個特點:
1.空間開辟的大小是固定的
2.數(shù)組在申明的時候,必須指定數(shù)組長度,它所需內(nèi)存在編譯時分配。
顯然,這樣無法滿足有些場景的要求,有時我們所需要的空間大小只有在程序運行的時候才知道。這時我們就需要用到動態(tài)內(nèi)存分配了。
如何進行動態(tài)內(nèi)存分配
首先我要介紹兩個函數(shù) malloc 和 free
void* malloc(size_t size);
這個函數(shù)向內(nèi)存申請一塊連續(xù)可用的空間,并返回指向這塊空間的指針。
- 如果開辟成功,則返回一個指向開辟好空間的指針。
- 如果開辟失敗,則返回一個NULL指針,因此malloc的返回值一定要做檢查。
- 返回值的類型是void*,所以malloc函數(shù)并不知道開辟空間的類型,具體在使用的時候由使用者來決定
- 如果參數(shù)size為0,malloc的行為是標(biāo)準(zhǔn)未定義的,取決于編譯器。
現(xiàn)在我們知道了如何去開辟空間,接下來,我們?nèi)W(xué)習(xí)一下如何將開辟的空間釋放掉。
void free(void* ptr);
C語言提供了另外一個函數(shù)free是專門用來釋放動態(tài)內(nèi)存的
- 如果參數(shù)ptr指向的空間不是動態(tài)內(nèi)存開辟的,那么free的行為是未定義的。
- 如果參數(shù)ptr是NULL指針,那么函數(shù)什么都不會做。
想使用malloc 和 free 都需要引入一個頭文件<stdlib.h>
接下來讓我們看個示例:
#include <stdlib.h> #include <stdio.h> int main() { int num = 0; scanf("%d", &num); int *ptr = (int*)malloc(sizeof(int) * num); //判斷是否開辟成功 if(NULL != ptr) { int i = 0; for(i = 0; i < num; i++) { *(ptr + i) = 0; } } free(ptr);//釋放空間 ptr = NULL; return 0; }
第二個開辟空間的動態(tài)內(nèi)存分配的函數(shù) calloc
void* calloc(size_t num, size_t size);
函數(shù)的功能是為num個大小為size的元素開辟一塊空間,并且把空間的每個字節(jié)都初始化為0
malloc與calloc的區(qū)別在于calloc會在返回地址之前把申請的空間的每個字節(jié)都初始化為0
舉個例子:
#include <stdio.h> #include <stdlib.h> int main() { int *p = (int*)calloc(10, sizeof(int)); if(NULL != p) { int i = 0; for(i = 0; i < 10; i++) { *(ptr + i) = 0; } } free(p); p = NULL; retrun 0; }
所以如果我們對申請的內(nèi)存空間的內(nèi)容要求初始化,那么可以很方便的使用calloc函數(shù)來完成任務(wù)。
大小修改函數(shù)realloc
有時候我們會發(fā)現(xiàn)之前申請的空間太小,有時又會覺得申請的空間過大,那為了合理的使用內(nèi)存,我們一定會對內(nèi)存的大小做靈活調(diào)整。realloch函數(shù)就可以對動態(tài)開辟的內(nèi)存大小進行調(diào)整
void* realloc(void* ptr, size_t size);
- ptr 是要調(diào)整的內(nèi)存地址
- size 調(diào)整之后的新大小
- realloc在調(diào)整內(nèi)存空間后的返回值有兩種情況
情況一:原有空間之后有足夠大的空間,要擴展內(nèi)存就直接在原有內(nèi)存之后追加空間,原有空間的數(shù)據(jù)不變。
情況二:原有空間之后無足夠大的空間,擴展方法是在堆上另找一塊連續(xù)的空間來使用,這樣函數(shù)返回的就是一個新的內(nèi)存地址
以上就是深入了解C語言中的動態(tài)內(nèi)存分配的詳細內(nèi)容,更多關(guān)于C語言 動態(tài)內(nèi)存分配的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C語言實現(xiàn)學(xué)生信息管理系統(tǒng)
這篇文章主要為大家詳細介紹了C語言實現(xiàn)學(xué)生信息管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-07-07C++基于boost asio實現(xiàn)sync tcp server通信流程詳解
這篇文章主要介紹了C++基于boost asio實現(xiàn)sync tcp server通信的流程,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07為什么要學(xué)習(xí)C語言 C語言優(yōu)勢分析
不止一個學(xué)生問到我:“老師,為什么我們的應(yīng)用程序設(shè)計要學(xué)C語言而不是別的?C語言不是已經(jīng)過時了嗎?如果現(xiàn)在要寫一個Windows程序,用VB或Dephi開發(fā)多快呀,用C行嗎?退一萬步,為什么選擇C而不是C++呢?”2013-07-07深入理解C語言 static、extern與指針函數(shù)
這篇文章主要介紹了C語言 static、extern與指針函數(shù),有需要的朋友可以參考一下2013-12-12