深入了解C語(yǔ)言中的動(dòng)態(tài)內(nèi)存分配
今天我們來學(xué)習(xí)一下C語(yǔ)言中的動(dòng)態(tài)內(nèi)存分配 開始學(xué)習(xí)吧

什么是動(dòng)態(tài)內(nèi)存分配
我們目前已經(jīng)知道的內(nèi)存開辟的方式有:
int val = 20;//在棧上開辟四個(gè)字節(jié)。
char arr[10] = { 0 };//在棧上開辟十個(gè)字節(jié)的連續(xù)空間
但是上述空間的開辟方式有兩個(gè)特點(diǎn):
1.空間開辟的大小是固定的
2.數(shù)組在申明的時(shí)候,必須指定數(shù)組長(zhǎng)度,它所需內(nèi)存在編譯時(shí)分配。
顯然,這樣無法滿足有些場(chǎng)景的要求,有時(shí)我們所需要的空間大小只有在程序運(yùn)行的時(shí)候才知道。這時(shí)我們就需要用到動(dòng)態(tài)內(nèi)存分配了。
如何進(jìn)行動(dòng)態(tài)內(nèi)存分配
首先我要介紹兩個(gè)函數(shù) malloc 和 free
void* malloc(size_t size);
這個(gè)函數(shù)向內(nèi)存申請(qǐng)一塊連續(xù)可用的空間,并返回指向這塊空間的指針。
- 如果開辟成功,則返回一個(gè)指向開辟好空間的指針。
- 如果開辟失敗,則返回一個(gè)NULL指針,因此malloc的返回值一定要做檢查。
- 返回值的類型是void*,所以malloc函數(shù)并不知道開辟空間的類型,具體在使用的時(shí)候由使用者來決定
- 如果參數(shù)size為0,malloc的行為是標(biāo)準(zhǔn)未定義的,取決于編譯器。
現(xiàn)在我們知道了如何去開辟空間,接下來,我們?nèi)W(xué)習(xí)一下如何將開辟的空間釋放掉。
void free(void* ptr);
C語(yǔ)言提供了另外一個(gè)函數(shù)free是專門用來釋放動(dòng)態(tài)內(nèi)存的
- 如果參數(shù)ptr指向的空間不是動(dòng)態(tài)內(nèi)存開辟的,那么free的行為是未定義的。
- 如果參數(shù)ptr是NULL指針,那么函數(shù)什么都不會(huì)做。
想使用malloc 和 free 都需要引入一個(gè)頭文件<stdlib.h>
接下來讓我們看個(gè)示例:
#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;
}
第二個(gè)開辟空間的動(dòng)態(tài)內(nèi)存分配的函數(shù) calloc
void* calloc(size_t num, size_t size);
函數(shù)的功能是為num個(gè)大小為size的元素開辟一塊空間,并且把空間的每個(gè)字節(jié)都初始化為0
malloc與calloc的區(qū)別在于calloc會(huì)在返回地址之前把申請(qǐng)的空間的每個(gè)字節(jié)都初始化為0
舉個(gè)例子:
#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;
}

所以如果我們對(duì)申請(qǐng)的內(nèi)存空間的內(nèi)容要求初始化,那么可以很方便的使用calloc函數(shù)來完成任務(wù)。
大小修改函數(shù)realloc
有時(shí)候我們會(huì)發(fā)現(xiàn)之前申請(qǐng)的空間太小,有時(shí)又會(huì)覺得申請(qǐng)的空間過大,那為了合理的使用內(nèi)存,我們一定會(huì)對(duì)內(nèi)存的大小做靈活調(diào)整。realloch函數(shù)就可以對(duì)動(dòng)態(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ù)返回的就是一個(gè)新的內(nèi)存地址

以上就是深入了解C語(yǔ)言中的動(dòng)態(tài)內(nèi)存分配的詳細(xì)內(nèi)容,更多關(guān)于C語(yǔ)言 動(dòng)態(tài)內(nèi)存分配的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- C語(yǔ)言 動(dòng)態(tài)內(nèi)存分配的詳解及實(shí)例
- C語(yǔ)言動(dòng)態(tài)內(nèi)存分配的詳解
- C語(yǔ)言中關(guān)于動(dòng)態(tài)內(nèi)存分配的詳解
- C語(yǔ)言 動(dòng)態(tài)內(nèi)存分配詳解
- c語(yǔ)言詳解動(dòng)態(tài)內(nèi)存分配及常見錯(cuò)誤的解決
- C語(yǔ)言編程C++動(dòng)態(tài)內(nèi)存分配示例講解
- C語(yǔ)言動(dòng)態(tài)內(nèi)存分配函數(shù)的實(shí)現(xiàn)
- C語(yǔ)言動(dòng)態(tài)內(nèi)存分配圖文講解
- c語(yǔ)言動(dòng)態(tài)內(nèi)存分配知識(shí)點(diǎn)及實(shí)例
- C語(yǔ)言實(shí)現(xiàn)動(dòng)態(tài)內(nèi)存分配
相關(guān)文章
C語(yǔ)言實(shí)現(xiàn)數(shù)組元素排序方法詳解
這篇文章主要為大家介紹了C語(yǔ)言算法練習(xí)中數(shù)組元素排序的實(shí)現(xiàn)方法,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C語(yǔ)言有一定幫助,需要的可以參考一下2023-02-02
c++中explicit與mutable關(guān)鍵字的深入探究
這篇文章主要給大家介紹了關(guān)于c++中explicit與mutable關(guān)鍵字的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-05-05
C語(yǔ)言中socket相關(guān)網(wǎng)絡(luò)編程函數(shù)小結(jié)
這篇文章主要介紹了C語(yǔ)言中socket相關(guān)網(wǎng)絡(luò)編程函數(shù)小結(jié),是C語(yǔ)言入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-09-09
一篇文章教你用C語(yǔ)言模擬實(shí)現(xiàn)字符串函數(shù)
這篇文章主要介紹了C語(yǔ)言模擬實(shí)現(xiàn)字符串函數(shù),開發(fā)程序的時(shí)候經(jīng)常使用到一些字符串函數(shù),例如求字符串長(zhǎng)度,拷貝字符串……,需要的朋友可以參考下2021-09-09
C++結(jié)構(gòu)體數(shù)組詳細(xì)解析
定義結(jié)構(gòu)體數(shù)組和定義結(jié)構(gòu)體變量類似,定義結(jié)構(gòu)體數(shù)組時(shí)只需聲明其為數(shù)組即可2013-10-10
C語(yǔ)言實(shí)現(xiàn)的學(xué)生選課系統(tǒng)代碼分享
這篇文章主要介紹了C語(yǔ)言實(shí)現(xiàn)的學(xué)生選課系統(tǒng)代碼分享,具有一定參考價(jià)值,需要的朋友可以了解下。2017-10-10

