深入了解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)存分配了。
如何進(jìn)行動態(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)存大小進(jìn)行調(diào)整
void* realloc(void* ptr, size_t size);
- ptr 是要調(diào)整的內(nèi)存地址
- size 調(diào)整之后的新大小
- realloc在調(diào)整內(nèi)存空間后的返回值有兩種情況
情況一:原有空間之后有足夠大的空間,要擴(kuò)展內(nèi)存就直接在原有內(nèi)存之后追加空間,原有空間的數(shù)據(jù)不變。
情況二:原有空間之后無足夠大的空間,擴(kuò)展方法是在堆上另找一塊連續(xù)的空間來使用,這樣函數(shù)返回的就是一個新的內(nèi)存地址

以上就是深入了解C語言中的動態(tài)內(nèi)存分配的詳細(xì)內(nèi)容,更多關(guān)于C語言 動態(tài)內(nèi)存分配的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C\C++實現(xiàn)讀寫二進(jìn)制文件的方法詳解
這篇文章主要為大家詳細(xì)介紹了C\C++實現(xiàn)讀寫二進(jìn)制文件的方法,文中的示例代碼講解詳細(xì),具有一定的借鑒價值,感興趣的小伙伴可以了解一下2023-03-03
C語言中一些將字符串轉(zhuǎn)換為數(shù)字的函數(shù)小結(jié)
這篇文章主要介紹了C語言中一些將字符串轉(zhuǎn)換為數(shù)字的函數(shù)小結(jié),分別為atoi()函數(shù)和atol()函數(shù)以及atof()函數(shù),需要的朋友可以參考下2015-08-08
VS2019如何創(chuàng)建C++項目的實現(xiàn)示例
這篇文章主要介紹了VS2019如何創(chuàng)建C++項目的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08

